如何使用Java中使用服务定位器设计模式使用连接池

时间:2020-02-23 14:34:46  来源:igfitidea点击:

在本教程中,我们将了解连接池。
这篇文章是由Java应用程序开发专家提供整个开发社区,让人们学习和承认连接池以及如何使用服务定位器设计模式使用其对象。

介绍

连接池是一种适用于世界上所有技术的机制。
我们可以使用Tomcat Server配置连接池,我们应该使用服务定位器设计模式以获得更好的连接池性能。

什么是连接池?

连接池是避免使用来自应用程序的每个客户端请求的数据库创建新连接的机制。
通过编程与DB连接太贵。
Java中有许多可配置的连接池机制。
使用连接池机制我们可以维护内存中的连接对象。
无论何时需要连接对象,我们都可以从内存池中重用可用连接,而不是创建新连接,除非应用程序所有连接都占用。
本文演示了如何在Apache Tomcat服务器中配置连接池以及如何使用Service Locator设计模式使用这些连接池对象。

什么是服务定位器设计模式?

服务定位器是J2EE设计模式,它介绍如何与应用程序中使用的可重用业务组件进行交互。
例如,一旦在Tomcat服务器中配置了连接池,就可以在Memory中的Tomcat服务器中使用所有可用连接。

如何从池中获取DB连接以供申请?

有许多方法可以获得在Tomcat服务器中配置的DB连接。
最好的方法是服务定位器设计模式。
如果要创建一个应该具有服务定位器行为的Java类,则类必须关注以下。
•类构造函数必须是私有的•类应具有静态方法,返回连接对象和委托客户端。
私有构造函数的责任是创建应用程序使用的必要服务。
在我们的示例中,服务定位器创建DBConnection并使其在内存中可用。

静态方法的责任是将服务提供给由私有构造函数创建的客户端应用程序。
以下是创建连接池的配置和代码实现。
Tomcat服务器中的DB连接和连接池配置。

要在Tomcat服务器中配置DB连接,请打开Conf/Context.xml并添加上述资源标记。
将MySQL连接属性应用于上面的XML代码中。
配置最大主动连接和空闲连接池。
在上面的示例10中是最大连接池,空闲为4.要在java程序中获取此连接对象,则需要创建在应用程序中全局使用的服务定位器Java类。
无论在何处,DB连接都需要,服务定位器将连接对象从内存中的Java提供。
以下是服务定位器类私有静态连接连接中的静态变量;以下是使用查找方法创建DataSource的私有构造函数。
在此示例中,我们的数据源名称是"jdbc/connectiontest"

private ConnectionPoolService() {
 
try{
 
Context initContext = new InitialContext();
Context envContext =(Context)initContext.lookup("java:/comp/env");
DataSource dataSource =(DataSource)envContext.lookup("jdbc/connectionTest");
connection = dataSource.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
}

JDBC/ConnectionTest是Conf/Context.xml文件中配置的DataSource名称,查找方法成功查找数据源名称,它将分配给DataSource对象。
使用DataSource对象,我们可以获得连接对象。
上述特定代码应该在应用程序中仅执行一次,因为,相同的连接对象应该在需要DB连接的位置使用。
整个代码放在私有构造函数中,这意味着我们无法在类外部调用此构造函数。

public static Connection getConnection() {
 if(connection == null) {
  new ConnectionPoolService();
 }
 return connection; 
}

上述方法是返回连接对象的静态方法。
此方法调用私有构造函数并创建连接对象。
根据此方法代码,每当调用此方法时,首先检查连接对象可用性。
如果连接对象不可用,它会调用私有构造函数以创建新的连接对象。
如果已有连接对象已可用,则此方法不会调用私有构造函数,而是将返回从Java内存中的可用连接。
通过这种方式,我们可以避免为每个DBS连接请求初始化新连接对象。
以下代码演示了如何从ConnectionPoolService获取连接对象。

public Customer getCustomerData(long customerId) throws MyDAOException {
  Connection connection = null;
  Customer customer = null;
  try {
    ResultSet resultSet = null; 
   connection = ConnectionPoolService.getConnection();
   Statement statement = connection.createStatement();
   String query = "SELECT * FROM customer where customer_id=" + customerId; 
   resultSet = statement.executeQuery(query);
   customer = new Customer();
   while (resultSet.next()) { 
    customer.setCustomerId(Long.parseLong(resultSet.getString(1)));
    customer.setCustomerName(resultSet.getString(2));
    customer.setEmailId(resultSet.getString(3));
   }
   
  }catch(Exception ex){
   ex.printStackTrace();
   throw new MyDAOException("Error while connecting db");
  }
finally
{
resultSet.close();
connection.close();
}
  return customer;
}

上述方法调用以下行返回连接对象。

connection = ConnectionPoolService.getConnection();

此方法直接返回从Java内存中的连接,或者根据连接对象的可用性创建新连接。