代码之家  ›  专栏  ›  技术社区  ›  a1ex07

正确使用JDBC连接池(Glassfish)

  •  10
  • a1ex07  · 技术社区  · 15 年前

    我需要在Java Web服务中实现作为会话bean的数据库连接,而我不确定是否正确。

    我创建了一个类

    public final class SQLUtils   {  
        //.....  
        private static DataSource  m_ds=null;    
    
        static  
        {  
            try
            {
                InitialContext ic = new InitialContext();
                m_ds = (DataSource) ic.lookup(dbName); //Connection pool and jdbc resource previously created in Glassfish  , dbName contains the proper JNDI resource name 
    
            }
            catch (Exception e)
            {
                e.printStackTrace();
                m_ds = null;
            }
    
        }
    
        public static Connection getSQLConnection() throws SQLException  
        {  
            return m_ds.getConnection();             
        }
    }
    

    每当我需要连接时,我都会

     Connection cn = null;  
     try  
     {
         cn = SQLUtils.getSQLConnection();
         // use connection
     }
     finally 
     {
         if (null != cn)
         {
             try
             {
                 cn.close();
             }
             catch (SQLException e)
             {
    
             }
         }
     }
    

    这样使用它可以吗,或者I数据源必须是bean的成员?

      @Stateless  
      @WebService  
      public class TestBean  {  
       private @Resource(name=dbName) DataSource m_ds;   
      }  
    

    我很抱歉如果这是一个Nube问题,但我对Java很陌生。事先谢谢。

    3 回复  |  直到 11 年前
        1
  •  15
  •   BalusC    15 年前

    除了C样式的格式、一些不必要的行和一些糟糕的异常处理之外,您可以这样做。

    我会这样做:

    public final class SQLUtil {
        private static DataSource dataSource;
        // ..
    
        static {
            try {
                dataSource = (DataSource) new InitialContext().lookup(name);
            } catch (NamingException e) {
                throw new ExceptionInInitializerError(e);
            }
        }
    
        public static Connection getConnection() throws SQLException {  
            return dataSource.getConnection();             
        }
    }
    

    我扔在这里 ExceptionInInitializerError 以便应用程序立即停止,这样您就不需要面对“无法解释的” NullPointerException 尝试获取连接时。

        2
  •  10
  •   Pascal Thivent    15 年前

    在古J2EE世界中,传统的管理方法是使用 ServiceLocator .下面是一个示例实现(非优化 DataSource 可以缓存):

    public class ServiceLocator {
        private Context initalContext;
    
        private static ServiceLocator ourInstance = new ServiceLocator();
    
        public static ServiceLocator getInstance() {
            return ourInstance;
        }
    
        private ServiceLocator() {
            try {
                this.initalContext = new InitialContext();
            } catch (NamingException ex) {
                throw new ServiceLocatorException(...);
            }
        }
    
        public DataSource getDataSource(String dataSourceName) {
            DataSource datasource = null;
    
            try {
                Context ctx = (Context) initalContext.lookup("java:comp/env");
                datasource = (DataSource) ctx.lookup(dataSourceName);
            } catch (NamingException ex) {
                throw new ServiceLocatorException(...);
            }
    
            return datasource;
        }
    }
    

    要使用它,只需这样称呼它:

    DataSource ds = ServiceLocator.getInstance().getDataSource("jdbc/mydatabase");
    

    但这是在EJB3和依赖注入时代之前。现在,在使用EJB3时,如果已经设置了 数据来源 在EJB容器中, 你所要做的就是自动注入 数据来源 在你的无状态bean中写 (何处) mydatabase 是数据源的名称):

    @Resource
    private DataSource mydatabase;
    

    如果要显式地设置名称,请使用name属性:

    @Resource(name="jdbc/mydatabase")
    private DataSource dataSource;
    

    EJB3实际上使 服务定位器 模式已过时,您在使用它们时应该更喜欢注入。

        3
  •  0
  •   Per Lindberg    11 年前

    嗯,这不是一个例子吗? 数据源 不是 玻璃鱼连接池 是吗?