首先大概浅谈一下数据库区别的(方便新人去大概了解数据库),mongodb介于关系型数据库和非关系型数据库之间,扩展以及效率都非常可观,平时进行业务拓展操作简便很多(个人感觉写sql可能麻烦一些),mysql应该是大家用的最多的了,就不多描述了。。。。对了,需要注意一点的是mysql的编码方式utf-8以及utf-8mb4的区别,最直观的就是可以存储一些特殊符号,当然,我发现这个问题是因为两个一样长的id报了错误(小白没有仔细研究,但是一开始表示很奇怪,明明一样长的id怎么会编码错误),百度一下是因为字符集导致的错误。后面修改了配置解决了问题。
场景:我们是两地分公司,网路连接也不好,几百万的数据量直接连接操作可能导致出现很多问题,所以尽量把数据库导入本地后进行清洗,然后再进行相关操作,导入本地,然后联系运维,或者自己去导入即可,代码还是比较简单的,主要是思想吧,= =当然思想也很简单啦,主要给一些需要快捷解决问题的朋友或者萌新提供一些思路,没有任何花里胡哨。
pom.xml:
<dependencies>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20170516</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
</dependencies>
代码:
值得提的一下 rewriteBatchedStatements参数设置成true,保证5.1.13以上版本的驱动,能实现高性能的批量插入,想具体了解可以去搜索一下资料,MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。(这里一句话是参考一位兄弟的,表示感谢。)
private String driver = "";
private String dbURL = "";
private String user = "";
private String password = "";
private static MySQLConnections connection = null;
private MySQLConnections() throws Exception {
driver = "com.mysql.cj.jdbc.Driver";
dbURL = "jdbc:mysql://localhost/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&rewriteBatchedStatements=true";
user = "root";
password = "123456";
System.out.println("dbURL:" + dbURL);
}
public static Connection getConnection() {
Connection conn = null;
if (connection == null) {
try {
connection = new MySQLConnections();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
try {
Class.forName(connection.driver);
conn = DriverManager.getConnection(connection.dbURL,
connection.user, connection.password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
private void doStore(List<Document> list, Connection conn,String sql) throws ClassNotFoundException, SQLException {
conn.setAutoCommit(false); // 设置手动提交
PreparedStatement psts = conn.prepareStatement(sql);
for (int i=0;i<list.size();i++){
if(list.get(i).containsKey("ci") && !"".equals(list.get(i).get("ci")+"") && !"".equals(list.get(i).get("metadata")+"")
){
psts.setString(1, list.get(i).containsKey("ci")?list.get(i).get("ci").toString():"" );
psts.setString(2, list.get(i).containsKey("name")?list.get(i).get("name").toString():"" );
psts.setString(3, list.get(i).containsKey("origin")?list.get(i).get("origin").toString():"" );
psts.setInt(4, list.get(i).containsKey("register") && !"".equals(list.get(i).get("register"))?Integer.parseInt(list.get(i).get("register").toString()):-1 );
psts.setString(5, list.get(i).containsKey("type")?list.get(i).get("type").toString():"" );
psts.setString(6, list.get(i).containsKey("category")?list.get(i).get("category").toString():"" );
psts.setString(7, list.get(i).containsKey("obligee")?list.get(i).get("obligee").toString():"" );
psts.setString(8, list.get(i).containsKey("date")?list.get(i).get("date").toString():"" );
psts.setString(9, list.get(i).containsKey("metadata") && Document.parse(list.get(i).get("metadata").toString()).containsKey("登记日期")?Document.parse(list.get(i).get("metadata").toString()).getString("登记日期"):"");
psts.setString(10,list.get(i).containsKey("metadata") && Document.parse(list.get(i).get("metadata").toString()).containsKey("创作完成日期")?Document.parse(list.get(i).get("metadata").toString()).getString("创作完成日期"):"");
psts.setString(11,list.get(i).containsKey("metadata") && Document.parse(list.get(i).get("metadata").toString()).containsKey("首次发表日期")?Document.parse(list.get(i).get("metadata").toString()).getString("首次发表日期"):"");
psts.addBatch();
}
}
psts.executeBatch(); // 执行批量处理
psts.close();
conn.commit(); // 提交
System.out.println("All down : " );
}
public static void main(String[] args) throws Exception {
System.out.println(999889 +737632 +587784+ 115271);
String sql = "INSERT copyright values(NULL,?,?,?,?,?,?,?,?,?,?,?)";
List<Document> d = new ArrayList<Document>();
d.add(new Document());
MySQLConnections m = new MySQLConnections();
MongoCollection<Document> md = mongodb.getConnect().getCollection("csv");
List<Document> s = new ArrayList<Document>();
//3200000 150电脑配置很低很卡....一次倒容易出问题分多批是最稳定的,资源使用后都关闭了,之前测试大概200w会内存溢出。
//1000000 2000000
//2000000 2600000
//2600000 3200000
System.out.println();
int count=0;
for (int i =2600000 ; i < 3200000; i += 100000) {
FindIterable<Document> find = md.find().skip(i).limit(100000);
find.into(s);
/* m.doStore(s, MySQLConnections.getConnection(), sql);*/
for (int j=0;j<s.size();j++){
if(s.get(j).containsKey("ci") && !"".equals(s.get(j).get("ci")+"") && !"".equals(s.get(j).get("metadata")+"")){
count++;
}
}
s.clear();
}
System.out.println(count);
//处理乱码测试
/* Document doc=new Document();
doc.put("ci","渝作登字-2014-A-00081030");
FindIterable<Document> find = md.find(doc);
find.into(s);
System.out.println(s.get(0));
m.doStore(s, MySQLConnections.getConnection(), sql);
s.clear();*/
//999889 737632 587784 115271
/*MySQLConnections.getConnection().close();*/
System.out.println("执行完毕");
}
好了,这样就解决了,不过这样两种数据库导入真的好气好气,一种有规则,一种无规则数据库,各种规则的数据只能一直试调