参看:http://blog.csdn.net/caoyinghui1986/archive/2008/04/22/2315864.aspx
其中屏蔽close方法的部分可以用动态代理实现。lz 不妨去试下。
其中屏蔽close方法的部分可以用动态代理实现。lz 不妨去试下。
解决方案 »
- 【求解一题java面试题】,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
- 新手提问:axis2 客户端如何调用服务端的webservice
- textArea.append("hello") 为什么报错
- S2SH项目中备份与恢复数据库问题?
- Apache的JCS缓存框架对结构化对象的支持问题
- 请教: Axis客户端调用https web service的问题
- 如何用弹出文本框的方式将一个字段的内容保存到数据库?
- 也谈java设计引用net mvc思路来设计view层,让代码更好的进行分离
- 请问struts中如何实现动态添加文本框?
- 如何将EJB接口信息转换为IDL!!!
- struts的路径问题
- 有人用java调用过 C 的函数吗
<Resource name="jdbc/dbname" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/dbname">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value>oa</value>
</parameter>
<parameter>
<name>password</name>
<value>oa</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://192.168.1.84:1433;DatabaseName=dbnmae;SelectMethod=cursor</value>
</parameter>
</ResourceParams>
</Context>
<property name="url" value="jdbc:jtds:sqlserver://localhost:1433;databasename=auction"></property>
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"></property>
<property name="maxIdle" value="60"></property>
<property name="maxWait" value="5000"></property>
<property name="username" value="sa"></property>
<property name="password" value=""></property>
<property name="maxActive" value="500"></property>
<property name="defaultAutoCommit" value="true"></property>
<property name="removeAbandonedTimeout" value="60"></property>
</bean>
一般情况下连接池都需要提供url,driverClass等数据库联接的属性。
还需要为连接池设置最大连接数目最小连接数等属性。在程序中可以通过JNDI来使用连接池:
ctx = new InitialContext();
Context envctx = (Context) ctx.lookup("java:comp/env");
DataSource ds = (DataSource) envctx.lookup("jdbc/TestDB");
Connection conn=ds.getConnection();Spring配置参考:
<bean id = "dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/TestDB</value>
</property>
</bean>hibernate配置参考:
<session-factory>
<property name="connection.datasource">
java:comp/env/jdbc/TestDB
</property>
......
</session-factory>
但是如果楼主想自己练习一下的话也能自己开发一个,数据库连接池无非就是"缓存多个数据库连接,然后通过ConnectionsManager(指代你编写的数据库连接池管理类)进行分配连接和回收连接",里面一些性能优化还得看楼主自己的水平,如何合理地分配连接,等连接数不足的时候要采取什么策略,回收连接后,如果空闲连接太多要如何处理,主要还有缓存方面的处理,如果缓存方面处理得好的话对性能有大的提高的
http://database.51cto.com/art/200512/12788.htm
import java.sql.*;
import java.util.*;/**
* 建立一个数据库连接池,用于提供和回收数据库连接。<p>
* 建立连接池的目的,一是为了代码复用,而是为了避免频繁的创建释放数据库连接。<p>
* public static synchronized DBConnectionPool getInstance()<p>
* 返回惟一实例,如果是第一次调用此方法,则创建该实例.<p>
* public synchronized void freeConnection(Connection con)<p>
* 将不再使用的连接返回给连接池.<p>
* public synchronized Connection getConnection()<p>
* 从连接池申请一个可用连接。如没有空闲的连接且当前连接数小于最大连接数的限制,则创建新的连接.
* @author shi_xiaoping
* Start Time:2008-3-28
*/public class DBConnectionPool {
private int minConn=1; //最小连接数
private int maxConn=3; //最大连接数
private String driver="";
private String url="";
private String user="";
private String password="";
private String logFile="log\\dbpool";//日志文件
private PrintWriter loger=null;
private int connAmount=0;
private Stack<Connection> connStack=new Stack<Connection>(); //使用STACK来保存数据库连接
private static DBConnectionPool instance=null;
/**
* 返回惟一实例,如果是第一次调用此方法,则创建该实例.
*/
public static synchronized DBConnectionPool getInstance(){
if(instance==null){
instance=new DBConnectionPool();
}
return instance;
}
private DBConnectionPool(){
//读取数据库属性文件
getProperty();
try{
/*
File file=new File(logFile);
if(file.exists()&&file.isFile()){
file.delete();//删除旧日志
}
file.createNewFile();//常见新日志
*/
//创建新日志文件名称
Calendar rightNow = Calendar.getInstance();
String appendString=MyCalendar.dateToString(rightNow);
if(appendString!=null){
logFile=logFile+appendString+".log";
}
loger=new PrintWriter(new FileWriter(logFile,true),true);
}catch(IOException ioe){
System.err.println("无法日记文件:"+ioe.getMessage());
loger=new PrintWriter(System.err);
}
//注册驱动程序
try{
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName(driver);
log("成功注册驱动程序");
}catch(Exception e){
log("无法注册驱动程序");
}
//根据最少连接数生成连接
for(int i=0;i<minConn;i++){
connStack.push(newConnection());
}
}
/**
* 从连接池申请一个可用连接。如没有空闲的连接且当前连接数小于最大连接数<p>
* 的限制,则创建新的连接.
*/
public synchronized Connection getConnection(){
Connection con=null;
log("从连接池申请一个连接");
log("现在可用的连接总数为:"+connStack.size());
if(!connStack.empty()){
//获取一个可用的连接
con=(Connection)connStack.pop();
}else if(connAmount<maxConn){
con=newConnection();
}
else{
try{
log("等待连接");
wait(10000);
return getConnection();
}catch(InterruptedException ie){
//用户等待
}
}
return con;
}
/**
* 将不再使用的连接返回给连接池.
*/
public synchronized void freeConnection(Connection con){
connStack.push(con); //将指定连接入栈
notifyAll(); //唤醒正在等待连接的进程
log("归还一个连接到连接池");
}
/**
* 创建新的连接
*/
private Connection newConnection(){
Connection con=null;
try{
con=DriverManager.getConnection(url,user,password);
connAmount++;
log("连接了创建一个新的连接");
}catch(SQLException e){
log("无法创建下列url的连接:"+e.getMessage());
return null;
}
return con;
}
/**
* 将文本信息写入日志文件
*/
private void log(String msg){
loger.println(new java.util.Date()+":"+msg);
}
/**
* 读取数据库属性配置文件datebase.properties
*/
private void getProperty() {
Properties prop = new Properties();
try {
FileInputStream in = new FileInputStream("datebase.properties");
prop.load(in);
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
}
catch(FileNotFoundException e){
e.printStackTrace();
log("数据库属性配置文件无法找到!");
}
catch(IOException e){
e.printStackTrace();
log("读取数据库属性配置失败!");
}
}
}
url=jdbc:odbc:hotel
user=sa
password=123456
: