创建数据库连接池:
public class DataSource {
private InputStream inStream;
private Properties pro;
private static int initCount = 5;// 初始连接数
private static int maxCount = 10;// 数据库最大连接数
int currentConnt = 0;// 当前数据库的连接数
LinkedList<Connection> connectionPool=new LinkedList<Connection>();
public DataSource(){
inStream=this.getClass().getResourceAsStream("/system.properties");
pro=new Properties();
try {
pro.load(inStream);
try {
Class.forName(pro.getProperty("driver"));
for(int i=0;i<initCount;i++){
connectionPool.addLast(CreateConnection());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private Connection CreateConnection(){
Connection conn=null;
MyConnectionProxy myproxy=null;
try {
conn=DriverManager.getConnection(pro.getProperty("url"), pro.getProperty("username"), pro.getProperty("password"));
myproxy=new MyConnectionProxy(this);
} catch (SQLException e) {
e.printStackTrace();
}
currentConnt++;
return myproxy.bind(conn);
}
public Connection GetConnection(){
synchronized (connectionPool) {
if(connectionPool.size()>0){
return connectionPool.removeFirst();
}
if(currentConnt<maxCount){
return CreateConnection();
}
throw new RuntimeException("数据库已达到最大连接数!");
}
}
}
创建代理类
public class MyConnectionProxy implements InvocationHandler {
private Connection realConnection;
private Connection proxyConnection;
private DataSource datasource;
private int maxUseCount = 10;
private int currentUserCount = 0;
MyConnectionProxy(DataSource ds){
this.datasource=ds;
}
Connection bind(Connection conn){
this.realConnection=conn;
proxyConnection=(Connection)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Connection.class}, this);
//Proxy.newProxyInstance()方法表示:产生一个新的类,该类继承于第二个参数Connnection,但该类的方法的现实是由第三个参数this负责实现
return proxyConnection;
}
//MyConnectionProxy类所有方法的实现都是由invoke方法实现
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(method.getName().equals("close")){
this.currentUserCount++;
if(this.currentUserCount<maxUseCount){
this.datasource.connectionPool.addLast(this.proxyConnection);
}else{
this.realConnection.close();
this.datasource.currentConnt--;
}
}
return method.invoke(this.realConnection, args);
}
}
JDBC工具类:
public class SQLDBConnection {
private static SQLDBConnection sqldb;
private DataSource datasource;
private SQLDBConnection(){
datasource=new DataSource();
}
public static SQLDBConnection getSQLDBConnection(){
if(sqldb==null){
synchronized (SQLDBConnection.class) {
if(sqldb==null){
sqldb=new SQLDBConnection();
}
}
}
return sqldb;
}
public Connection GetConnection(){
return this.datasource.GetConnection();
}
public
分享到:
相关推荐
动态代理的实现方式较为复杂,一般使用Java自带的`java.lang.reflect.Proxy`类和`InvocationHandler`接口来实现。动态代理的好处在于可以灵活地为多个类提供统一的代理服务,而无需针对每个类单独编写代理类。 1. *...
3. **嵌套事务处理**:当业务服务层的方法相互调用时,可能会产生嵌套事务,处理起来较为复杂。 为了解决这些问题,可以引入设计模式,如事务代理(Transaction Proxy)或装饰者(Decorator)模式。事务代理模式...
### Java手机程序设计入门8 —— ...综上所述,《Java 手机程序设计入门 8》这一章节通过详细介绍 MIDP for Palm OS 的使用方法,为 J2ME 新手提供了宝贵的学习资料,同时也对 Java 移动应用开发领域产生了深远的影响。
- **定义**:用于生成动态内容的Java服务器端技术。 - **生命周期**:初始化、服务、销毁。 **5.1.3 JSP入门** - **定义**:Java Server Pages,用于创建动态网页的技术。 - **特点**:结合HTML标签与Java代码。 *...
JAVA试题(100道) —————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte 题目2:d 如下程序中:...
装饰器模式是指为一个对象动态的加上一系列的动作,而不需要因为这些动作的不同而产生大量的继承类。例如,java.io.BufferedInputStream(InputStream) 将一个 InputStream 对象装饰为一个带缓冲的 InputStream 对象...
POST请求不是幂等的,连续发送可能产生不同的结果,比如多次创建相同数据可能会创建多个资源。 四、HttpRequestTool.java 在给定的"HttpRequestTool.java"文件中,我们可以推测这是一个用于发送HTTP请求的工具类。...
4. 额外的依赖:可能需要如`dom4j.jar`用于XML处理,`javassist.jar`用于动态代理等。 在获取了所有必需的JAR文件后,你需要将它们添加到项目的类路径中。这通常可以通过以下方式完成: - 如果你使用的是Eclipse、...
jdbc: 1.数据库连接的方式: ODBC:开放式数据库连接。 C语言实现的,提供语言和(基于SQL的)数据库进行交互的“一致性”的...1.load()方法默认要加载的对象一定存在,所以很放心的使用代理对象,等到用到的时候从...
JMeter是Java开发的,所以确保你的系统已经安装了Java运行环境。然后从Apache官网下载最新版本的JMeter,解压到任意目录,通过双击bin目录下的`jmeter.bat`(Windows)或`jmeter.sh`(Unix/Linux)启动JMeter。界面...
这会产生一个与AIDL文件同名的Java接口,但扩展名为`.java`。这个生成的Java类是客户端和服务端都可以使用的,它提供了序列化和反序列化的功能,使得数据能够在进程间传递。 3. **在服务中实现接口** 在服务端,你...
客户端通过`bindService()`方法连接服务,并获取到`IMyService`接口的代理对象,然后就可以调用服务端的方法了: ```java ServiceConnection connection = new ServiceConnection() { @Override public void ...
将牛郎织女分开(本应在一起,分开他们,形成两个接口),在他们之间搭建一个桥(动态的结合) 设计模式之 Flyweight(共享元) 提供 Java运行性能,降低小而大量重复的类的开销. C. 行为模式 设计模式之 Command(命令) ...
Chrome浏览器有时会采用预连接(pre-connection)技术,即在请求HTML文件之前预先建立多个TCP连接,以便更快地加载网页资源。如果HTML文件链接的资源较少,或者资源已经被客户端缓存,这些未使用的连接会被关闭。...
HttpURLConnection con = (HttpURLConnection) url.openConnection(); // 设置网络连接的一些属性... } ``` 3. **本地代理接口方式调用**: - **定义**:使用工具自动生成本地代理类,简化调用过程。 - **...
在EJB调用机制中,存根(stub)是在客户端端产生的,用于代理远程方法调用。 25. **禁用默认拦截器的注释** 禁用默认拦截器的注释是`@Interceptors({})`。 26. **注入资源的注释** 注入资源的注释是`@...
接着,你可以配置`settings.xml`文件来定制Maven的行为,如代理服务器、远程仓库位置、服务器认证和密码等。`localRepository`标签用于指定本地仓库的路径。 然后,通过执行Maven命令,你可以进行清理、安装、创建...
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件...
此外,JDK的动态代理只对接口有效,否则必须使用CGLIB生成目标类的子类。我们依从于Spring的倡导为业务类定义一个接口: 代码 7 业务层操作接口 1. public interface FileService 2. { 3. void save...