Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用连接池_Java_Mysql_Connection - Fatal编程技术网

Java 如何使用连接池

Java 如何使用连接池,java,mysql,connection,Java,Mysql,Connection,我是连接池方面的新手。我在mysql中创建了一个连接池,添加了五个连接。现在我想知道连接池的应用是什么,即在创建了连接池之后,如何使用它。。我正在这里粘贴代码 import java.sql.DriverManager; import java.sql.SQLException; import java.util.Vector; import com.mysql.jdbc.Connection; class ConnectionPoolManager { String databaseUr

我是连接池方面的新手。我在mysql中创建了一个连接池,添加了五个连接。现在我想知道连接池的应用是什么,即在创建了连接池之后,如何使用它。。我正在这里粘贴代码

import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Vector;

import com.mysql.jdbc.Connection;

class ConnectionPoolManager {

String databaseUrl = "jdbc:mysql://localhost:3306/homeland";
String userName = "root";
String password = "root";

Vector connectionPool = new Vector();

public ConnectionPoolManager() {
    initialize();
}

public ConnectionPoolManager(
// String databaseName,
        String databaseUrl, String userName, String password) {
    this.databaseUrl = databaseUrl;
    this.userName = userName;
    this.password = password;
    initialize();
}

private void initialize() {
    // Here we can initialize all the information that we need
    initializeConnectionPool();
}

private void initializeConnectionPool() {
    while (!checkIfConnectionPoolIsFull()) {
        System.out
                .println("Connection Pool is NOT full. Proceeding with adding new connections");
        // Adding new connection instance until the pool is full
        connectionPool.addElement(createNewConnectionForPool());
    }
    System.out.println("Connection Pool is full.");
}

private synchronized boolean checkIfConnectionPoolIsFull() {
    final int MAX_POOL_SIZE = 5;

    // Check if the pool size
    if (connectionPool.size() < 5) {
        return false;
    }

    return true;
}

// Creating a connection
private Connection createNewConnectionForPool() {
    Connection connection = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        connection = (Connection) DriverManager.getConnection(databaseUrl,
                userName, password);
        System.out.println("Connection: " + connection);
    } catch (SQLException sqle) {
        System.err.println("SQLException: " + sqle);
        return null;
    } catch (ClassNotFoundException cnfe) {
        System.err.println("ClassNotFoundException: " + cnfe);
        return null;
    }

    return connection;
}

public synchronized Connection getConnectionFromPool() {
    Connection connection = null;

    // Check if there is a connection available. There are times when all
    // the connections in the pool may be used up
    if (connectionPool.size() > 0) {
        connection = (Connection) connectionPool.firstElement();
        connectionPool.removeElementAt(0);
    }
    // Giving away the connection from the connection pool
    return connection;
}

public synchronized void returnConnectionToPool(Connection connection) {
    // Adding the connection from the client back to the connection pool
    connectionPool.addElement(connection);
}

public static void main(String args[]) {
    new  ConnectionPoolManager();
}

}
导入java.sql.DriverManager;
导入java.sql.SQLException;
导入java.util.Vector;
导入com.mysql.jdbc.Connection;
类连接池管理器{
字符串databaseUrl=“jdbc:mysql://localhost:3306/homeland";
字符串userName=“root”;
字符串password=“root”;
向量连接池=新向量();
公共连接池管理器(){
初始化();
}
公共连接池管理器(
//字符串数据库名,
字符串数据库URL、字符串用户名、字符串密码){
this.databaseUrl=databaseUrl;
this.userName=用户名;
this.password=密码;
初始化();
}
私有void初始化(){
//在这里,我们可以初始化我们需要的所有信息
初始化连接池();
}
私有void initializeConnectionPool(){
而(!checkIfConnectionPoolIsFull()){
系统输出
.println(“连接池未满。继续添加新连接”);
//添加新连接实例,直到池已满
addElement(createNewConnectionForPool());
}
System.out.println(“连接池已满”);
}
专用同步布尔值checkIfConnectionPoolIsFull(){
最终整数最大池大小=5;
//检查池大小是否正确
if(connectionPool.size()<5){
返回false;
}
返回true;
}
//创建连接
专用连接createNewConnectionForPool(){
连接=空;
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
connection=(连接)DriverManager.getConnection(数据库URL,
用户名、密码);
System.out.println(“连接:+连接”);
}捕获(SQLException sqle){
System.err.println(“SQLException:+sqle”);
返回null;
}捕获(ClassNotFoundException cnfe){
System.err.println(“ClassNotFoundException:+cnfe”);
返回null;
}
回路连接;
}
公共同步连接getConnectionFromPool(){
连接=空;
//检查是否有可用的连接。有时
//池中的连接可能已用完
如果(connectionPool.size()>0){
connection=(connection)connectionPool.firstElement();
connectionPool.removeElementAt(0);
}
//正在从连接池中放弃连接
回路连接;
}
公共同步的void returnConnectionPool(连接){
//将连接从客户端添加回连接池
connectionPool.addElement(连接);
}
公共静态void main(字符串参数[]){
新建ConnectionPoolManager();
}
}

有人能帮忙吗?

连接池的目的是维护到数据库的许多打开的连接,这样当应用程序需要连接时,它就不必经历打开新连接的潜在资源和时间密集的过程

当应用程序需要数据库连接时,它会从池中“借用”一个数据库连接。完成后,它会将其返回,并且该连接可能会在以后的某个时候重新使用

一旦获得了连接,就可以通过JDBC(Java数据库连接)API在应用程序中使用它

Oracle使用JDBC的基本教程可以在


要记住的另一件事是,开发连接池已经做了很多工作,可能没有必要重新发明轮子,也许只是作为一种学习练习。ApacheTomcat的连接池实现可以在Tomcat之外使用(例如,在独立的Java应用程序中),并且相当灵活,易于配置。它可以在

上找到,我想说,代码是非常不言自明的

你创建了一个池的实例,就我个人而言,我更喜欢使用单例,但这是另一个主题

ConnectionPoolManager connectionPoolManager = new  ConnectionPoolManager();
现在,每个想要连接的人都需要一个对这个经理的引用。需要时,可以从池中请求免费连接

public void queryDatabaseForStuff(ConnectionPoolManager cpm) throws SQLException {
    Connection con = cpm.getConnectionFromPool();
    //....
连接完成后,将其传递回经理

 try {
     //...
 } finally {
     cmp.returnConnectionToPool(con);
 }
现在。您可能希望调查一个阻塞进程,该进程将在池为空时阻塞对
getConnectionFromPool
的当前调用,这意味着它将抛出异常(如果您希望包含超时功能)或有效连接


重新汇集
连接时,您可能希望检查
连接是否已关闭,并进行某种恢复过程,以确保该池已接近容量…

请查看此链接以获取详细答案-

您不需要重新创建连接对象池,而是请使用Apache提供的库。请清楚以下内容: 1-为什么以及是什么让您想到连接池? 2-在Maven项目中使用以下ApacheCommons dbcp库,然后根据文档使用这些类。
3.这能解决你所有的问题吗

你创造了一些你不知道该如何使用的东西?有趣的设计过程…不要自己写。使用现有的一个。ApacheDBCP已经可以工作了。我告诉程序员我是连接池方面的新手,我已经发布了代码,以便可以继续here@lucifer有了一个你想要实现的想法,我会认为这将是你的第一个标准-IMHO。但我同意EJP,最好使用已经创建的东西,然后尝试重新发明轮子。它至少会让你了解如何使用它,以及它为你做了什么——IMHO