我需要在作为会话bean实现的Java Web服务中建立数据库连接,我不确定我是否正确。
我创建了一个类
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)
{
}
}
}
可以这样使用它,还是DataSource必须是bean的成员?
@Stateless
@WebService
public class TestBean {
private @Resource(name=dbName) DataSource m_ds;
}
如果这是一个nube问题,我很抱歉,但我对Java很新。提前谢谢。
答案 0 :(得分: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
。
答案 1 :(得分:10)
在古代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容器中设置了DataSource
,那么所有您需要做的就是在无状态Bean中自动注入DataSource
就是编写(其中mydatabase
是数据源的名称):
@Resource
private DataSource mydatabase;
如果要明确地使用name属性,请设置名称:
@Resource(name="jdbc/mydatabase")
private DataSource dataSource;
EJB3实际上使ServiceLocator
模式过时了,在使用它时你应该更喜欢注入。
答案 2 :(得分:0)
嗯,这不是 JDBC DataSource 的示例,而不是 Glassfish连接池吗?