使用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 ...
3. 获取 Connection 对象,以便进行数据库操作 通过使用 JDBC,可以实现对 MySQL 数据库的基本操作,例如创建、删除、修改和查询数据。 JDBCProxy 的工作原理和使用方法 JDBCProxy 是一个开源的 JDBC 代理项目,...
当`Class.forName()`执行后,驱动程序会被注册到`DriverManager`中,使得之后可以通过`DriverManager.getConnection()`方法建立数据库连接。 其次,`DriverManager.registerDriver()`方法允许我们手动注册一个`java...
这段代码中,`getCon()`方法用于获取数据库连接,`Class.forName()`用于加载Oracle的JDBC驱动,`DriverManager.getConnection()`用于建立实际的连接。 4. **执行主函数测试连接**: 在`DBHelp`类中添加`main`方法...
3. JDBC JServer Proxy Driver: 此驱动主要用于旧版的Oracle Net Services,现在已被淘汰。 4. JDBC Universal Driver: 这是一个包含所有其他驱动的综合性驱动,允许开发者根据需要选择合适的连接方式。 在描述中...
conn=DriverManager.getConnection("jdbc:proxy:xxx"); }catch(ClassNotFoundException e){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } ... 2) ... Connection conn=null; ...
它包括Sharding-JDBC和Sharding-Proxy两部分,其中Sharding-JDBC定位为轻量级Java框架,可以直接嵌入到现有应用中,无需额外部署和依赖,兼容性强,支持MySql、Oracle、SQLServer等多种数据库。 ### 2. 分库分表...
Connection conn = ds.getConnection(); ``` 感谢您的阅读,希望这些信息对您解决问题有所帮助。对于更多关于Tomcat、JDBC驱动管理或者内存泄漏预防的深入学习,建议查阅Apache Tomcat的官方文档及相关Java编程...
JDBC的核心组件包括DriverManager、Connection、Statement和ResultSet。在实际应用中,通常需要先加载数据库驱动,然后通过DriverManager获取数据库连接,接着创建Statement或PreparedStatement对象来执行SQL,最后...
解压后打开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 ,但是该库还提供了...
3. JDBC JServer Proxy Driver:这个驱动用于在JDBC和Oracle Pro*C/C++中间进行通信,主要用于旧版的Oracle应用程序。 4. JDBC Universal Driver:也称为“Advanced Queuing”驱动,支持JMS(Java Message Service...
A toy JDBC connection pool simulating MyBatis PooledDataSource. Feature 通过动态代理支持连接对象自动回收 动态代理支持 JDK Proxy 方式 动态代理支持 Cglib 方式 支持连接池自动扩容、缩容 支持使用 ...
- **ProxyConnection**: 代理连接,实现了JDBC的Connection接口,透明地处理连接的获取和释放。 - **WrappedConnection**: 真实的数据库连接,被ProxyConnection包装,隐藏了底层实现的细节。 **使用与配置** ...
Connection pooledConnection = (Connection) Proxy.newProxyInstance( Connection.class.getClassLoader(), new Class[]{DatabaseConnection.class}, new ConnectionPoolInvocationHandler(realConnection) ); ...
Connection realConn = ((Connection) proxy).getRealConnection(); return method.invoke(realConn, args); } } } ``` 4. **使用示例**: - 用户可以通过以下方式获取连接并进行操作: ```java ...
在"meta-programming-jdbc"项目中,可能的实现方式是创建一个抽象层,这个抽象层使用反射来自动设置SQL语句的参数,或者使用动态代理来封装JDBC的Connection、PreparedStatement和ResultSet等对象,以简化数据操作。...
3. JDBC JServer Proxy Driver(Type 3):这是一个中间层驱动,它在Java应用程序和Oracle Net Services之间起到代理的作用。 4. JDBC Driver for SQL*Net to Oracle(Type 1):这是最早的Oracle JDBC驱动,现在...
Proxool是Proxy JDBC Pool的缩写,它通过创建数据库连接的代理来实现连接池。该框架的主要优点包括:轻量级、易于集成、支持多种数据库、提供监控和统计信息。在0.9.0RC3版本中,它继续强化了这些特性,为开发者提供...
Connection conn = proxy.getConnection(); ``` 以上就是关于Proxool必备的三个JAR包以及它们在数据库连接池中的作用。理解并正确使用这些库文件,对于优化Java应用程序的数据库访问性能至关重要。