JAVA使用JDBC批量插入SQL
2016-04-26 15:51
411 查看
数据库连接使用proxool连接JDBC
代码 JAVA类
proxool XML配置文件
耍要的JAR包
dom4j-1.6.1.jar
log4j-1.2.13.jar
ojdbc14.jar
proxool-0.9.1.jar
proxool-cglib.jar
代码 JAVA类
package com.czr.proxool; import org.logicalcobwebs.proxool.ProxoolException; import org.logicalcobwebs.proxool.configuration.JAXPConfigurator; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * 使用proxool连接orcale * 当使用JDBC操作数据时出现起出打开游标最大数的原因:一般出现在执行大量插入语句 时,没有关闭Statement. 解决方法:每次插入一条数据时或找执行一次批量提交时,记得 * @author chenzhirong */ public class ProxoolUtile { public static String dburl = "jdbc:oracle:thin:@192.168.104.192:1521:tim"; public static String user = "tim"; public static String password = "tim_8968888"; private static ProxoolUtile proxoolUtile; private static Connection conn; private static Statement stmt; private static int count; public static ProxoolUtile getProxoolUtile() { // TODO Auto-generated method stub if (proxoolUtile == null) { proxoolUtile = new ProxoolUtile(); } return proxoolUtile; } /** * JDBC方式测试 * * @throws Exception */ public static void test1() throws Exception { String testsql = "select * from village t where lastid = 346"; // 1:注册驱动类 Class.forName("oracle.jdbc.driver.OracleDriver"); // 2:创建数据库连接 Connection conn = DriverManager.getConnection(dburl, user, password); // 3:创建执行SQL的对象 Statement stmt = conn.createStatement(); // 4:执行SQL,并获取返回结果 ResultSet rs = stmt.executeQuery(testsql); // 5:处理返回结果,此处打印查询结果 while (rs.next()) { System.out.print(rs.getLong("id") + "\t"); System.out.print(rs.getString("name") + "\t"); System.out.println(); } // 6:关闭数据库连接 conn.close(); } /** * proxool方式测试 创建数据库连接 * * @throws Exception */ public static Connection getConn() { // Java应用中先要加载配置文件,否则谁知道你配置给谁用的 try { if (conn == null) { JAXPConfigurator.configure("proxool.xml", false); // 1:注册驱动类,这次这个驱动已经不是Oracle的驱动了,是Proxool专用的驱动 Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); // 2:创建数据库连接,这个参数是一个字符串,是数据源的别名,在配置文件中配置的timalias,参数格式为:proxool.数据源的别名 } if (conn == null || conn.isClosed() == true) { conn = DriverManager.getConnection("proxool.DBczr"); } } catch (ProxoolException e) { System.out.println("配置文件不正確"); e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block System.out.println("加載驱动"); e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("数据库连接断开"); e.printStackTrace(); } return conn; } /** * 使用Statement批量提交SQL * * @param sql SQL语句 * @return */ public int[] insertStmtBatchSql(String sql) { int[] i = null; if (count == 0) { try { if(conn == null || conn.isClosed() == true){ conn = ProxoolUtile.getConn(); } stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); } catch (SQLException e1) { e1.printStackTrace(); } } try { // 增加批量语句 if(stmt == null){ stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); } stmt.addBatch(sql); count++; // 500条SQL时,执行批量提交 if (count > 500) { i = stmt.executeBatch(); conn.commit(); stmt.close(); conn.close(); count = 0; } } catch (SQLException e) { e.printStackTrace(); } return i; } /** * * Statement * 不完整个,自己加SQL语句参数 * @param sql * @return */ public void insertBatchSql(String sql) { int count = 0; try { if (conn == null) { // Java应用中先要加载配置文件,否则谁知道你配置给谁用的 JAXPConfigurator.configure("proxool.xml", false); // 1:注册驱动类,这次这个驱动已经不是Oracle的驱动了,是Proxool专用的驱动 Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); // 2:创建数据库连接,这个参数是一个字符串,是数据源的别名,在配置文件中配置的timalias,参数格式为:proxool.数据源的别名 conn = DriverManager.getConnection("proxool.DBczr"); // 设置手动提交 conn.setAutoCommit(false); } PreparedStatement ps = conn.prepareStatement(sql); count++;// 记录 if (count % 500 == 0) {// 当增加了500个批处理的时候再提交 ps.executeBatch();// 执行批处理 conn.commit();// 提交 stmt.close(); conn.close();// 关闭数据库 } } catch (ProxoolException e) { System.out.println("配置文件不正確"); e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block System.out.println("加載驱动"); e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("数据库连接断开"); e.printStackTrace(); } } /** * 查询序列 * Statement记得关闭,不然使用批量插入会有问题 * @param sql * @return */ public Long querySeq(String sql) { Long seq = Long.valueOf(1); // Connection conn = null; Statement stmt = null; try { if(conn == null || conn.isClosed() == true ){ conn = ProxoolUtile.getConn(); } stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { seq = rs.getLong("nextval"); } } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally{ try { stmt.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return seq; } /** * 关闭连接 */ public static void closeConn() { try { if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { // getStatement(); } }
proxool XML配置文件
<?xml version="1.0" encoding="UTF-8"?> <something-else-entirely> <proxool> <alias>DBczr</alias> <!--数据源的别名 10.142.54.121 --> <driver-url>jdbc:oracle:thin:@127.0.0.1:1521:orcl</driver-url> <!--url连接串--> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <!--驱动类--> <driver-properties> <property name="user" value="czr"/> <!--用户名--> <property name="password" value="czr"/> <!--密码--> </driver-properties> <!--最大连接数(默认5个),超过了这个连接数,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定 --> <maximum-connection-count>100</maximum-connection-count> <!--最小连接数(默认2个)--> <minimum-connection-count>10</minimum-connection-count> <!--proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒--> <house-keeping-sleep-time>90000</house-keeping-sleep-time> <!--没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受--> <maximum-new-connections>10</maximum-new-connections> <!--最少保持的空闲连接数(默认2个)--> <prototype-count>5</prototype-count> <!--在使用之前测试--> <test-before-use>true</test-before-use> <!--用于保持连接的测试语句 --> <house-keeping-test-sql>select sysdate from dual</house-keeping-test-sql> </proxool> </something-else-entirely>
耍要的JAR包
dom4j-1.6.1.jar
log4j-1.2.13.jar
ojdbc14.jar
proxool-0.9.1.jar
proxool-cglib.jar
相关文章推荐
- 图的邻接矩阵存储---JAVA实现
- java集合框架12——HashMap和HashTable的区别
- struts2的Action(四)
- Java源码之String
- [org.jeecgframework.core.common.exception.MyExceptionHandler]org.springframework.
- LeetCode之位操作题java
- (2.1.25)关于时间,日期,星期,月份的算法(Java中Calendar的使用方法)
- lambda表达式
- 设计模式之六大原则——依赖倒置原则(DIP)
- Win7 64位系统下DirectX SDK安装S1023错误解决
- Java Thread 总结
- JPA规范:Java Persistence API 标准规范用法示例
- Java垃圾回收机制
- 使用IBM heapAnalyzer分析内存泄露的原因
- elasticsearch Java API [2.3] » Search API
- Java并发编程:深入剖析ThreadLocal
- spring 技术内幕--IOC初始化过程深入之BeanDefinition的载入和解析1
- java获取两个时间的相隔时间,包括年、月、日、时、分、秒
- [Java并发包学习七]解密ThreadLocal
- java 实现 LINQ 的一些框架记录一下