gpt4 book ai didi

java - 无法在 bluemix 上使用 java 注释初始化数据源

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:17:10 27 4
gpt4 key购买 nike

我有一个在 bluemix 云服务器上运行的 java 应用程序,我最初是在 tomcat 服务器上本地开发的,然后决定迁移到云端。随处建议的选项是使用 liberty 和 sqldb 服务,经过一番努力后,我在我的 bluemix 帐户上进行了设置,并将名为 SQL-RCT 的 sql 数据库绑定(bind)为我的 java 应用程序的服务。

运行以下代码时遇到的问题:

@WebServlet({ "/LoginServlet", "/" })
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

private Connection conn;

@Resource(lookup="jdbc/SQL-RCT")
private DataSource myDataSource;

/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
try {
if(myDataSource == null){
throw new Exception("no data source");
}
conn = myDataSource.getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

当我尝试加载 servlet 时,我收到一个错误,指出我的 init 函数中存在空指针异常,我很快就能够将其范围缩小到我的 myDataSource 对象为空。

我已经检查了 server.xml 并使用了正确的名称进行查找,但查找似乎不起作用,我们将不胜感激。

server.xml

<server>
<featureManager>
<feature>beanValidation-1.1</feature>
<feature>cdi-1.2</feature>
<feature>ejbLite-3.2</feature>
<feature>el-3.0</feature>
<feature>jaxrs-2.0</feature>
<feature>jdbc-4.1</feature>
<feature>jndi-1.0</feature>
<feature>jpa-2.1</feature>
<feature>jsf-2.2</feature>
<feature>jsonp-1.0</feature>
<feature>jsp-2.3</feature>
<feature>managedBeans-1.0</feature>
<feature>servlet-3.1</feature>
<feature>websocket-1.1</feature>
<feature>icap:managementConnector-1.0</feature>
<feature>appstate-1.0</feature>
<feature>cloudAutowiring-1.0</feature>
</featureManager>
<application name='myapp' location='myapp.war' type='war' context-root='/'/>
<cdi12 enableImplicitBeanArchives='false'/>
<httpEndpoint id='defaultHttpEndpoint' host='*' httpPort='${port}'/>
<webContainer trustHostHeaderPort='true' extractHostHeaderPort='true'/>
<include location='runtime-vars.xml'/>
<logging logDirectory='${application.log.dir}' consoleLogLevel='INFO'/>
<httpDispatcher enableWelcomePage='false'/>
<applicationMonitor dropinsEnabled='false' updateTrigger='mbean'/>
<config updateTrigger='mbean'/>
<appstate appName='myapp' markerPath='${home}/../.liberty.state'/>
<dataSource id='db2-SQL-RCT' jdbcDriverRef='db2-driver' jndiName='jdbc/SQL-RCT' statementCacheSize='30' transactional='true'>
<properties.db2.jcc id='db2-SQL-RCT-props' databaseName='${cloud.services.SQL-RCT.connection.db}' user='${cloud.services.SQL-RCT.connection.username}' password='${cloud.services.SQL-RCT.connection.password}' portNumber='${cloud.services.SQL-RCT.connection.port}' serverName='${cloud.services.SQL-RCT.connection.host}'/>
</dataSource>
<jdbcDriver id='db2-driver' libraryRef='db2-library'/>
<library id='db2-library'>
<fileset id='db2-fileset' dir='${server.config.dir}/lib' includes='db2jcc4.jar db2jcc_license_cu.jar'/>
</library>
</server>

最佳答案

注入(inject)的资源在 servlet 构造函数中不可用,因为在 servlet 实例完全初始化之前资源不会被注入(inject)。

相反,覆盖 javax.servlet.GenericServlet init() 方法并在那里获取您的连接。此生命周期方法将为您提供与您当前尝试在servlet 构造函数。

示例代码:

@WebServlet({ "/LoginServlet", "/" })
public class LoginServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;

private Connection conn;

@Resource(lookup="jdbc/SQL-RCT")
private DataSource myDataSource;

@Override
public void init() throws ServletException {
super.init();
try {
conn = myDataSource.getConnection();
} catch (Exception e) {
throw new ServletException(e);
}
}
}

作为旁注:
由于 Liberty 池连接,因此没有必要在类范围内存储连接。如果您在需要时获得连接并在使用完后关闭它们,您应该看不到任何性能差异。如果您想在 servlet 初始化代码中获取连接作为一种急切获取连接的方式,那很好,但它会影响您的 servlet 加载时间。

关于java - 无法在 bluemix 上使用 java 注释初始化数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33754849/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com