JDBC 连接池代码列子Word文件下载.docx

上传人:b****3 文档编号:17002588 上传时间:2022-11-27 格式:DOCX 页数:25 大小:19.74KB
下载 相关 举报
JDBC 连接池代码列子Word文件下载.docx_第1页
第1页 / 共25页
JDBC 连接池代码列子Word文件下载.docx_第2页
第2页 / 共25页
JDBC 连接池代码列子Word文件下载.docx_第3页
第3页 / 共25页
JDBC 连接池代码列子Word文件下载.docx_第4页
第4页 / 共25页
JDBC 连接池代码列子Word文件下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

JDBC 连接池代码列子Word文件下载.docx

《JDBC 连接池代码列子Word文件下载.docx》由会员分享,可在线阅读,更多相关《JDBC 连接池代码列子Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。

JDBC 连接池代码列子Word文件下载.docx

;

StringCLOSE="

close"

StringPREPARESTATEMENT="

prepareStatement"

StringCOMMIT="

commit"

StringROLLBACK="

rollbakc"

/**

*构造函数,采用私有,防止被直接创建

*@paramparam

*连接参数

privateConnectionProxy(ConnectionParamparam){

//记录日志

try{

//创建连接

Class.forName("

oracle.jdbc.driver.OracleDriver"

);

conn=DriverManager.getConnection("

jdbc:

oracle:

thin:

@10.8.1.234:

1521:

WF4PPDB"

"

PP42"

"

DatabaseMetaDatadm=null;

dm=conn.getMetaData();

//判断是否支持事务

supportTransaction=dm.supportsTransactions();

}catch(Exceptionex){

ex.printStackTrace();

}

publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)

throwsThrowable{

Objectobj=null;

//判断是否调用了close的方法,如果调用close方法则把连接置为无用状态

if(CLOSE.equals(method.getName())){

//设置不使用标志

setFree(false);

if(statRef!

=null)

statRef.close();

if(preStatRef!

preStatRef.close();

returnnull;

//判断是使用了createStatement语句

if(CREATESTATE.equals(method.getName())){

obj=method.invoke(conn,args);

statRef=(Statement)obj;

returnobj;

}catch(ClassCastExceptionex){

//判断是使用了prepareStatement语句

if(PREPARESTATEMENT.equals(method.getName())){

preStatRef=(PreparedStatement)obj;

//如果不支持事务,就不执行该事物的代码

if((COMMIT.equals(method.getName())||ROLLBACK.equals(method

.getName()))

&

&

(!

isSupportTransaction())){

//设置最后一次访问时间,以便及时清除超时的连接

lastAccessTime=System.currentTimeMillis();

*创建连接的工厂,只能让工厂调用

*@paramfactory

*要调用工厂,并且一定被正确初始化

*@return连接

publicstaticConnectionProxygetConnection(ConnectionFactoryfactory,

ConnectionParamparam){

//判断是否正确初始化的工厂

if(factory.isCreate()){

ConnectionProxy_conn=newConnectionProxy(param);

return_conn;

}else{

publicConnectiongetFreeConnection(){

//返回数据库连接conn的接管类,以便截住close方法

Connectioncn=(Connection)Proxy.newProxyInstance(conn.getClass()

.getClassLoader(),conn.getClass().getInterfaces(),this);

returncn;

*该方法真正的关闭了数据库的连接

*@throwsSQLException

publicvoidclose()throwsSQLException{

//由于类属性conn是没有被接管的连接,因此一旦调用close方法后就直接关闭连接

conn.close();

publicvoidsetFree(booleanisFree){

this.isFree=isFree;

publicbooleanisFree(){

returnisFree;

*判断是否支持事务

*@returnboolean

publicbooleanisSupportTransaction(){

returnsupportTransaction;

}

importjava.sql.Connection;

importjava.sql.SQLException;

importjava.util.*;

publicclassConnectionFactory{

privatestaticConnectionFactorym_instance=null;

//在使用的连接池

privateLinkedHashSetConnectionPool=null;

//空闲连接池

privateLinkedHashSetFreeConnectionPool=null;

//最大连接数

privateintMaxConnectionCount=10;

//最小连接数S

privateintMinConnectionCount=2;

//当前连接数

privateintcurrent_conn_count=0;

//连接参数

privateConnectionParamconnparam=null;

//是否创建工厂的标志

privatebooleanisflag=false;

//是否支持事务

//定义管理策略

privateintManageType=0;

*构造器

privateConnectionFactory(){

ConnectionPool=newLinkedHashSet();

FreeConnectionPool=newLinkedHashSet();

*使用指定的参数创建一个连接池

publicConnectionFactory(ConnectionParamparam,FactoryParamfparam)

throwsSQLException{

if((param==null)||(fparam==null))

thrownewSQLException("

ConnectionParam和FactoryParam不能为空"

if(m_instance==null){

synchronized(ConnectionFactory.class){

//参数定制

m_instance=newConnectionFactory();

connparam=param;

m_instance.MaxConnectionCount=fparam

.getMaxConnectionCount();

m_instance.MinConnectionCount=fparam

.getMinConnectionCount();

m_instance.ManageType=fparam.getManageType();

m_instance.isflag=true;

//初始化,创建MinConnectionCount个连接

System.out.println("

connectionfactory创建!

"

for(inti=0;

i<

m_instance.MinConnectionCount;

i++){

ConnectionProxyconn=ConnectionProxy

.getConnection(m_instance,m_instance.connparam);

if(conn==null)

continue;

connection创建"

m_instance.FreeConnectionPool.add(conn);

//加入空闲连接池

m_instance.current_conn_count++;

//标志是否支持事务

m_instance.supportTransaction=conn

.isSupportTransaction();

//根据策略判断是否需要查询

if(m_instance.ManageType!

=0){

Threadt=newThread(newFactoryManageThread(

m_instance));

t.start();

*标志工厂是否已经创建

publicbooleanisCreate(){

returnm_instance.isflag;

*从连接池中取一个空闲的连接

*@returnConnection

publicsynchronizedConnectiongetFreeConnection()throwsSQLException{

Connectioncn=null;

//获取空闲连接

Iteratorir=m_instance.FreeConnectionPool.iterator();

while(ir.hasNext()){

ConnectionProxyconn=(ConnectionProxy)ir.next();

//找到未用的连接

if(!

conn.isFree()){

cn=conn.getFreeConnection();

conn.setFree(true);

//移出空闲区

m_instance.FreeConnectionPool.remove(conn);

//加入连接池

m_instance.ConnectionPool.add(conn);

break;

//检查空闲池是否为空

if(m_instance.FreeConnectionPool.isEmpty()){

//再检查是否能够分配

if(m_instance.current_conn_count<

m_instance.MaxConnectionCount){

//新建连接到空闲连接池

intnewCount=0;

//取得要建立的数目

if(m_instance.MaxConnectionCount

-m_instance.current_conn_count>

=m_instance.MinConnectionCount){

newCount=m_instance.MinConnectionCount;

newCount=m_instance.MaxConnectionCount

-m_instance.current_conn_count;

newCount;

ConnectionProxy_conn=ConnectionProxy.getConnection(

m_instance,connparam);

m_instance.FreeConnectionPool.add(_conn);

//如果不能新建,检查是否有已经归还的连接

ir=m_instance.ConnectionPool.iterator();

ConnectionProxy_conn=(ConnectionProxy)ir.next();

_conn.isFree()){

cn=_conn.getFreeConnection();

_conn.setFree(false);

m_instance.ConnectionPool.remove(_conn);

//再次检查是否能分配连接

if(cn==null){

ir=m_instance.FreeConnectionPool.iterator();

_conn.setFree(true);

m_instance.FreeConnectionPool.remove(_conn);

m_instance.ConnectionPool.add(_conn);

if(cn==null)

//如果不能则说明无连接可用

没有可用的数据库连接"

GetConnection"

*关闭该连接池中的所有数据库连接

publicsynchronizedvoidclose()throwsSQLException{

this.isflag=false;

SQLExceptionsqlError=null;

//关闭空闲池

((ConnectionProxy)ir.next()).close();

Closeconnection:

Free"

m_instance.current_conn_count--;

if(exinstanceofSQLException){

sqlError=(SQLException)ex;

//关闭在使用的连接池

Using"

if(sqlError!

throwsqlError;

*返回是否支持事务

returnm_instance.supportTransaction;

*连接池调度管理

publicvoidschedule(){

Iteratorir=null;

//检查是否有已经归还的连接

if(m_instance.MaxConnectionCount-m_instance.current_conn_count>

m_instance.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1