澳门美高梅手机网站采取SQLite数据库与Access数据库的有经验总结

Spark
GraphX是一个分布式的觊觎处理框架。社交网络中,用户以及用户之间会有复杂的联络,如微信、QQ、微博之用户之间的知心人、关注相当涉嫌,构成了同一布置高大的希冀,单机无法处理,只能使用分布式图处理框架处理,Spark
GraphX就是如出一辙种植分布式图处理框架。

在我的《Winform开发框架》中,可下多种数据库作为序的数据源,除了正常的Oracle数据库、SqlServer、MySql数据库,其中尚连了SQLite数据库、Access数据库,后少独数据库都是当单机版程序中经常因此到之数据库,各自持有好的特性,在自身之《Winform开发框架》的提炼和多独品类的往往用过程遭到,对SQLite数据库、Access数据库的有些特点开展了片总结,以期达成常用常新,避免走弯路的目的。

1. POM文件

于类型的pom文件被长Spark
GraphX的管:

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-graphx_2.10</artifactId>
            <version>1.6.0</version>
        </dependency>

1、简化数据库的地方,使用|DataDirectory|代替运行目录

好采取这种|DataDirectory|的点子,这个是放的.net目录,可以替运行时刻的即目录。

运用这|DataDirectory|关键字来几许值得注意的地方,就是要是出Asp.net的Web应用或WCF服务应用,那么把数据库放到App_Data目录下,这是一个非常之目录;如果是支付Winform程序,就是将数据库放到运行程序的一干二净目录即可,不欲在创造App_Data了,因为Winform里,这个不是非常目录,如果你创造了这般的目,反而是画蛇添足了还不能够健康运转。

用这种方法,那么你构建的数据库连接方式就如下所示。

Access数据库的链接字符串:

connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ComponentData.mdb;User ID=Admin;Jet OLEDB:Database Password=;"

Sqlite的链接字符串:

connectionString="Data Source=|DataDirectory|\ComponentData.db;Version=3;"

2. 安运行环境

    // 设置运行环境
    val conf = new SparkConf().setAppName("Simple GraphX").setMaster("spark://master:7077").setJars(Seq("E:\\Intellij\\Projects\\SimpleGraphX\\SimpleGraphX.jar"))
    val sc = new SparkContext(conf)

2、SQLite 数据导入的安装

SQLite 数据库管理来好多工具,我因此了不少,总还是认为SQLite
Developer最为有利,除了创建新数据库、注册数据库、加密解密、查询修改表等、还支持各种数据库数据的导入操作,不过貌似以使用数据的导入的当儿,需要注意有地方,否则恐怕会见产出乱码或者未科学的地方。

SQLite
Developer日期设置,在导入数据库前,我们一般需要设置该工具的一些性。

澳门美高梅手机网站 1

导入数据后,显示的日子格式就会正常的了。

澳门美高梅手机网站 2

除此以外,如果现存的数据库(例如SQLServer数据库)中之字段为ntext(或者nvarchar(max))类型或者Access的memo类型的数目有中文的始末,导入到SQLite里面纵使会见并发乱码现象,这个是一个比较头疼的事情。

假定字段内容未顶非常的语,那么得将ntext(或者nvarchar(max))类型的字段修改为nvarchar(4000以下),然后运SQLite
Developer导入到Sqlite数据库中,那么即使正常显示中文。

万一情节比较深,除非采用重复好的SQLite管理工具或者使用C#代码编写例子插入数据库内容,暂时还未曾再次好之法。

3. 图底组织

图是出于多终端和限做的,Spark
GraphX里面的希冀也是相同的,所以于初始图之前,先使定义若干底巅峰和止:

    // 顶点
    val vertexArray = Array(
      (1L,("Alice", 38)),
      (2L,("Henry", 27)),
      (3L,("Charlie", 55)),
      (4L,("Peter", 32)),
      (5L,("Mike", 35)),
      (6L,("Kate", 23))
    )

    // 边
    val edgeArray = Array(
      Edge(2L, 1L, 5),
      Edge(2L, 4L, 2),
      Edge(3L, 2L, 7),
      Edge(3L, 6L, 3),
      Edge(4L, 1L, 1),
      Edge(5L, 2L, 3),
      Edge(5L, 3L, 8),
      Edge(5L, 6L, 8)
    )

下一场再利用点和边生成独家的RDD:

    //构造vertexRDD和edgeRDD
    val vertexRDD:RDD[(Long,(String,Int))] = sc.parallelize(vertexArray)
    val edgeRDD:RDD[Edge[Int]] = sc.parallelize(edgeArray)

末了以有限独RDD生成图:

    // 构造图
    val graph:Graph[(String,Int),Int] = Graph(vertexRDD, edgeRDD)

3、SQLite语法内容

每当利用SQLite的当儿,你会意识她的语法既类似SQLServer,又微微类似MySql,又有点自己之特性。

SQL语法:

Select * From [Patient] where leavedate > date('2012-08-01') order by leavedate Limit 10,50

1)例如地方的语,其中的[Patient]使用了”[]”作为限定符,默认正常的单词也可免用,使用它的目的是为着防备和保留字、关键字同名的。

2)上面语句date(‘2012-08-01’)或者datetime(‘2012-08-01
12:30:00′)这样的格式,是以对字符串进行转换为日期进行比较,如果无以是date或者datetime关键字,那么数据库会实现字符串的自查自纠,如果时光之格式不匹配,如日期中储存的凡2010-8-1这样的始末,而sql语句比较的下,使用
leavedate >’2010-08-01’ 的字符串进行较就见面面世逻辑上不正确了。

3)limit语法。使用limit进行分页比较简单,这个话类似于MySql的语法,Limit
10,50
的意是跨了10履,取50履之意,返回50条记下。,Limit 10当下是回10久记下的意。

4)在采取参数化语句子之时节,SQLite数据库可行使 @ 符号,也可以动用 $
符号进行拍卖。

5)如果插入一条记下,想取最后一久之回到从增长ID的语,那么用语句 Select
LAST_INSERT_ROWID()就可抱到了。

4. 图的属性操作

Spark GraphX图的属性包括:

(1)
Graph.vertices:图备受之兼具终端;

(2) Graph.edges:图中有着的底限;

(3)
Graph.triplets:由三有些构成,源顶点,目的顶点,以及个别个终端之间的边;

(4)
Graph.degrees:图被拥有终端的度;

(5)
Graph.inDegrees澳门美高梅手机网站:图备受保有终端的入度;

(6)
Graph.outDegrees:图中具有终端的出度;

本着这些性的操作,直接上代码:

    //图的属性操作
    println("*************************************************************")
    println("属性演示")
    println("*************************************************************")
    // 方法一
    println("找出图中年龄大于20的顶点方法之一:")
    graph.vertices.filter{case(id,(name,age)) => age>20}.collect.foreach {
      case(id,(name,age)) => println(s"$name is $age")
    }

    // 方法二
    println("找出图中年龄大于20的顶点方法之二:")
    graph.vertices.filter(v => v._2._2>20).collect.foreach {
      v => println(s"${v._2._1} is ${v._2._2}")
    }

    // 边的操作
    println("找出图中属性大于3的边:")
    graph.edges.filter(e => e.attr>3).collect.foreach(e => println(s"${e.srcId} to ${e.dstId} att ${e.attr}"))
    println

    // Triplet操作
    println("列出所有的Triples:")
    for(triplet <- graph.triplets.collect){
      println(s"${triplet.srcAttr._1} likes ${triplet.dstAttr._1}")
    }
    println

    println("列出边属性>3的Triples:")
    for(triplet <- graph.triplets.filter(t => t.attr > 3).collect){
      println(s"${triplet.srcAttr._1} likes ${triplet.dstAttr._1}")
    }
    println

    // Degree操作
    println("找出图中最大的出度,入度,度数:")
    def max(a:(VertexId,Int), b:(VertexId,Int)):(VertexId,Int) = {
      if (a._2>b._2) a else b
    }
    println("Max of OutDegrees:" + graph.outDegrees.reduce(max))
    println("Max of InDegrees:" + graph.inDegrees.reduce(max))
    println("Max of Degrees:" + graph.degrees.reduce(max))
    println

 运行结果:

Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
17/05/22 20:45:35 INFO Slf4jLogger: Slf4jLogger started
17/05/22 20:45:35 INFO Remoting: Starting remoting
17/05/22 20:45:35 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkDriverActorSystem@192.168.1.101:53375]
*************************************************************
属性演示
*************************************************************
找出图中年龄大于20的顶点方法之一:
Peter is 32
Alice is 38
Charlie is 55
Mike is 35
找出图中年龄大于20的顶点方法之二:
Peter is 32
Alice is 38
Charlie is 55
Mike is 35
找出图中属性大于3的边:
3 to 2 att 7
5 to 3 att 8
5 to 6 att 8

列出所有的Triples:
Henry likes Alice
Henry likes Peter
Charlie likes Henry
Charlie likes Kate
Peter likes Alice
Mike likes Henry
Mike likes Charlie
Mike likes Kate

列出边属性>3的Triples:
Charlie likes Henry
Mike likes Charlie
Mike likes Kate

找出图中最大的出度,入度,度数:
Max of OutDegrees:(5,3)
Max of InDegrees:(1,2)
Max of Degrees:(2,4)

4、Access和Sqlite数据库的链接字符串

Access2000/Access2003的链接字符串格式:

<add name="access2000" providerName="System.Data.OleDb" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\WareHouse.mdb;User ID=Admin;Jet OLEDB:Database Password=;" />

Access2007底链接字符串格式(使用下还需要安装AccessDatabaseEngine的数据库引擎):

<add name="access2007" providerName="System.Data.OleDb"
         connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database1.accdb;User ID=Admin;"/>

Sqlite数据库链接字符串:

<add name="sqlite"  providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WareHouse.db;Version=3;" />

Sqlite数据库链接字符串(含加密密码):

<add name="sqlite"  providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WareHouse.db;Version=3;Password=myPassword" />

5、Access的特殊语法

Access大多数之语法和SqlServer的语法一致,不过起部分较特别一点。

1)参数化语句,Access也支持参数化的言语的,不过他们的顺序必须与参数出现的相继一致,否则就会出错。

2)使用EnterpriseLibrary类库注意事项,Access参数化设置的时,需要修改日期类型为OleDbType.Date。

                param[i] = new OleDbParameter("@" + field, val);
                if (val is DateTime)
                {
                    param[i].OleDbType = OleDbType.Date;//日期类型特别处理,否则Access数据库访问出错
                }

3)获取最后插入的起增长ID,可以由此语句SELECT @@IDENTITY获得。

6、动态数据库字符串加密

我们清楚,对于SQLite或者Access这些数据库,链接字符串里面的密码要是无加密的明白,数据库链接才会为中识别,而这般尽管不克大好的保障我们的数据库了。为了贯彻有效的数据库管理,可以对数据库加密(使用用户看不到数据库密码),而放链接字符串的时光,我们没放置密码部分,而当代码里面动态为数据库连接字符串进行加密(硬绑定密码),这种啊是一个使得之主意,程序发布后,程序集里面的密码通过混淆加密,一般不足识别。例如我之Winform开发框架下的动态追加数据库密码字符串的法如下所示。

        #region 连接字符串加密

        /// <summary>
        /// 根据配置数据库配置名称生成Database对象
        /// </summary>
        /// <returns></returns>
        protected override Database CreateDatabase()
        {
            Database db = null;
            if (string.IsNullOrEmpty(dbConfigName))
            {
                db = DatabaseFactory.CreateDatabase();
            }
            else
            {
                db = DatabaseFactory.CreateDatabase(dbConfigName);
            }

            DbConnectionStringBuilder sb = db.DbProviderFactory.CreateConnectionStringBuilder();
            sb.ConnectionString = GetConnectionString();
            GenericDatabase newDb = new GenericDatabase(sb.ToString(), db.DbProviderFactory);
            db = newDb;

            return db;
        }

        /// <summary>
        /// 动态改变或者连接字符串
        /// </summary>
        /// <returns></returns>
        protected virtual string GetConnectionString()
        {
            string connectionString = "";
            DatabaseSettings setting = ConfigurationManager.GetSection("dataConfiguration") as DatabaseSettings;
            if(setting != null)
            {
                string defaultConnection = setting.DefaultDatabase;
                connectionString = ConfigurationManager.ConnectionStrings[defaultConnection].ConnectionString;

                //尝试加密或者解密
                if(!connectionString.EndsWith(";"))
                {
                    connectionString += ";";
                }
                connectionString += string.Format("Jet OLEDB:Database Password=mypassword;");
            }

            return connectionString;
        }

        #endregion 

如上就是局部关于SQLite数据库和Access数据库的运经验总结,希望读者会有得,并能享用自己的经验总结,非常感谢您的翻阅,如果发金玉的见解可以留言告知。

 

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注