使用jdbc访问数据库,少不了DataSource的配置
package com.xiva.jdbc.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import com.xiva.jdbc.exception.DaoException;
public class MyDataSource {
private static String url = "jdbc:mysql://localhost:3306/xivadata";
private static String user = "root";
private static String password = "njusc123";
private int initCount = 5;
private int maxFreeCount = 20;
private int maxCount = 50;
public int CurrentCount = initCount;
LinkedList<Connection> connPool = new LinkedList<Connection>();
public MyDataSource(){
for(int i=0;i<initCount;i++){
connPool.addLast(createConnection());
}
}
public Connection createConnection(){
Connection conn = null;
try{
conn = DriverManager.getConnection(url, user, password);
}
catch(SQLException e){
throw new DaoException();
}
MyConnectionHandler proxy = new MyConnectionHandler(this);
return proxy.bind(conn);
}
public Connection getConnection() throws SQLException{
Connection conn = null;
//为了线程安全
synchronized (connPool) {
if(connPool.isEmpty()){
if(CurrentCount<maxCount){
System.out.println(CurrentCount);
conn = createConnection();
CurrentCount++;
}
else{
throw new SQLException("Out of pool size!");
}
}
else{
conn = connPool.removeFirst();
}
}
return conn;
}
public void free(Connection conn){
if(connPool.size()<maxFreeCount){
connPool.addLast(conn);
}
else{
try {
conn.close();
} catch (SQLException e) {
throw new DaoException("free failure");
}
}
}
}
有了dataSource,下面来代理他的Connection对象:
package com.xiva.jdbc.demo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
public class MyConnectionHandler implements InvocationHandler{
//代理方式,所谓代理模式可以这样解释:为其他对象提供一种代理以控制对这个对象的访问。
private Connection warpedConnetion;//代理对象
private Connection realConnetion;//被代理的对象
private MyDataSource dataSource;
private int initCount = 5;
private int maxCount = 50;
private int CurrentCount = initCount;
MyConnectionHandler(MyDataSource dataSource){
this.dataSource = dataSource;
}
Connection bind(Connection realConn){
this.realConnetion = realConn;
this.warpedConnetion = (Connection)Proxy.newProxyInstance(this.getClass().getClassLoader(),
new Class[]{}, this);
return warpedConnetion;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
if("close".equals(method.getName())){
this.CurrentCount++;
if(this.CurrentCount < this.maxCount){
this.dataSource.connPool.addLast(warpedConnetion);
}else{
this.realConnetion.close();
this.dataSource.CurrentCount--;
}
}
return method.invoke(realConnetion, args);
}
}
使用这种缓存机制,可以加大访问数据库的速度。当然这也是一般数据源(DataSource)的作用。
代码中,有一个需要注意到的知识就是:InvocationHandler接口。
分享到:
相关推荐
Proxool: Proxy JDBC Connection Poolby billhorsman A Java SQL Driver that provides a connection pool wrapper around another Driver of your choice. Very simple to migrate existing code. Fully ...
conn=DriverManager.getConnection("jdbc:proxy:xxx"); }catch(ClassNotFoundException e){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } ... 2) ... Connection conn=null; ...
解压后打开cas-server-3.3.1-release\cas-server-3.3.1\modules ,将cas-server-webapp-3.3.1.war 重命名为cas.war,并将war包拷贝到tomcat5.5以上版本的webapps目录下(在此对server jdbc支持不做详细解读,测试...
用于分布式跟踪的库(如果在classpath中找到)可启用jdbc连接和查询跟踪(仅适用于p6spy或datasource-proxy) 为什么不将DataSource包装在配置中? 除了使用库之外,您还可以手动包装DataSource ,但是该库还提供了...
A toy JDBC connection pool simulating MyBatis PooledDataSource. Feature 通过动态代理支持连接对象自动回收 动态代理支持 JDK Proxy 方式 动态代理支持 Cglib 方式 支持连接池自动扩容、缩容 支持使用 ...
private Connection proxyConnection; private long checkoutTimestamp; private long createdTimestamp; private long lastUsedTimestamp; private int connectionTypeCode; private boolean valid; // ...
String conf = "/org/sky/proxy/pool.xml"; try { IConnectionPool pool = ConnectionPoolFactory.buildConnectionPoolFactory(conf).getConnectionPool("default"); IConnection conn = pool.getConnection();...
bonecp.connectionTimeout = 10000 #连接池助手线程数量,可设置为0,该参数会降低运行速度,但程序有大量连接时,有助于提升高并发程序的性能 bonecp.releaseHelperThreads = 0 #语句助手线程数,可设置为0,该...
此问题是DBProxy在多个分表merge结果的过程中未处理 NULL 值,导致结果集返回不对,而JDBC接口会认为此种情况下是未收到结果,会处于一直等待状态,触发超时 解决在分表情况下, IN 子句中分表列只支持 ...
可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于 和...
17.2. 安装logstash-input-jdbc插件步骤: 65 17.3. 启动logstash 66 18. HDFS 67 18.1. 退出安全模式: 67 19. Kafka 67 19.1. 优化 67 20. Spark2.x 68 20.1. 示例执行 68 21. YARN 68 21.1. 错误处理 68 22. ...
Auto-configured JDBC Tests 43.3.13. Auto-configured jOOQ Tests 43.3.14. Auto-configured Data MongoDB Tests 43.3.15. Auto-configured Data Neo4j Tests 43.3.16. Auto-configured Data Redis Tests 43.3.17....
5.1.3 使用session的connection()方法 273 5.1.4 使用session的delete()方法 274 5.1.5 使用session的get()方法 274 5.1.6 使用session的load()方法 275 5.1.7 使用session的save()方法 275 5.1.8 使用session...