我是连接池中的新手。我在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();
}
}
任何人都可以帮忙吗?
答案 0 :(得分:0)
连接池的目的是维护与数据库的许多开放连接,这样当您的应用程序需要连接时,它不必经历打开新连接的潜在资源和时间密集型过程。
当应用程序需要数据库连接时,它会从池中“借”一个。完成后,它会将其返回,并且该连接可能会在稍后的某个时间点重复使用。
获得连接后,可以通过JDBC(Java数据库连接)API在应用程序中使用它。
可以在http://docs.oracle.com/javase/tutorial/jdbc/basics/index.html
找到Oracle的使用JDBC的基本教程要记住的另一件事是,很多工作已经用于开发连接池,并且可能没有必要重新发明轮子,除非作为学习练习。 Apache Tomcat的连接池实现可以在Tomcat之外使用(例如,在独立的Java应用程序中),并且相当灵活且易于配置。它可以在https://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html
找到答案 1 :(得分:0)
我会说代码非常自我解释。
你创建了一个池的实例,个人而言,我更喜欢使用单例,但这是另一个主题
ConnectionPoolManager connectionPoolManager = new ConnectionPoolManager();
现在,每个想要连接的机构都需要对这个经理的引用。如果需要,您可以要求从游泳池免费连接......
public void queryDatabaseForStuff(ConnectionPoolManager cpm) throws SQLException {
Connection con = cpm.getConnectionFromPool();
//....
完成连接后,将其传递给经理......
try {
//...
} finally {
cmp.returnConnectionToPool(con);
}
现在。您可能希望调查阻塞进程,该进程在池为空时阻止当前对getConnectionFromPool
的调用,这意味着它将抛出异常(如果要包括超时功能)或有效连接。
重新汇集Connection
时,您可能想查看Connection
是否已关闭,并进行某种复兴过程以确保游泳池接近最低限度...
答案 2 :(得分:0)
请查看此链接以获取详细的答案-https://examples.javacodegeeks.com/core-java/sql/jdbc-connection-pool-example/
您不需要重新创建Connection对象池,请使用Apache提供的库。请清除以下内容: 1-为什么以及为什么让您想到连接池? 2-在您的Maven项目中使用以下Apache commons-dbcp lib,然后根据文档使用这些类。 3.这样可以解决您所有的问题吗?
答案 3 :(得分:0)