2014-09-05 70 views
0

我以前一直在使用多个连接池API,但我认为是时候自己做一些事情了。 Iam目前正在寻找一种非常基本的MySQL连接池功能,我可以在其上进行构建。如果你们能给我一个诚实的意见,我真的很感激!轻量级自制Java MySQL连接池 - 它会工作吗?

下面的代码:

package temp.jdbc; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 

public class MySQL { 

    private static final String driver = "com.mysql.jdbc.Driver"; 
    private static final String url = "jdbc:mysql://localhost:3306/beta"; 
    private static final String username = "root"; 
    private static final String password = "mypassword"; 

    private static List<Connection> pool = new ArrayList<Connection>(); 

    public static void setup() { 

     try { 

      for(int i = 0; i < 5; i++) { 
       Class.forName(driver); 
       Connection connection = DriverManager.getConnection(url, username, password); 
       pool.add(connection); 
      } 

     } 
     catch (ClassNotFoundException e) { e.printStackTrace(); } 
     catch (SQLException e) { e.printStackTrace(); } 

    } 

    public static void addConnection(Connection connection) { 
     pool.add(connection); 
    } 

    public static Connection getConnection() { 
     Connection connection = null; 
     if(pool.size() <= 0) return connection; 
     connection = pool.get(0); pool.remove(0); 
     return connection; 
    } 

} 

提前感谢!

真诚, Gemaken

+0

至少你的连接池应该实现'javax.sql.DataSource'接口(所以使用该池的代码不知道它使用了一个池),尽管你真的不应该实现你自己的接口。如果你真的开始这样做,看看C3P0 - http://sourceforge.net/projects/c3p0 - 它得到它的权利 – 2014-09-05 11:26:21

+0

感谢您的快速回复!我会看看,但首先,请告诉我,为什么每个人都确信,人们应该使用现有的连接池API? – Gemaken 2014-09-05 11:35:23

+0

在绝大多数情况下,“自己动手”是不对的。像C3P0这样的API是稳健的实现,已被数千人使用,使其得到很好的验证 – 2014-09-05 13:55:30

回答

0

有您的实现连接池的一些重大问题 - 连接不返回到池中,没有线程安全,不堵时正在使用的所有连接,它是静态的,等等。

鉴于此,我将从基础开始。

首先,任何游泳池的全部要点是需要一个昂贵的资源,在这个例子中是javax.sql.Connection,以便将来可以重复使用,避免再次创建资源的成本。

大多数池中都有最小值和最大值 - 创建时,池将创建最小数量的资源,并且可以在资源消耗时扩展到最大值。

当从池中检索资源时,应该保证检索线程独占使用该资源,直到资源返回到池。

如果所有资源都被使用,任何进一步获取资源的尝试都应该阻塞(有某种超时),直到资源可用。

使用池意味着应用程序是多线程的,因此实现是线程安全的也很重要。

由于JDBC API定义明确,连接池通常实现javax.sql.DataSource,允许连接池根据需​​要切入和切出。鉴于此,应使用javax.sql.Connection.close()将连接返回到池。