数据库连接使用proxool连接JDBC


代码 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