Liferay portlet 非 liferay JNDI 数据源 null

Liferay portlet non-liferay JNDI data source null

对于访问非 liferay Oracle 数据库的 Liferay 6.2 自定义 portlet,我们 运行 遇到返回数据源为空的问题。

我们已经配置了 tomcat/conf/context.xml

<!-- Adding custom New non liferay datasource -->
<Resource name="jdbc/NewPool" 
auth="Container"               
type="javax.sql.DataSource" 
driverClassName="oracle.jdbc.OracleDriver" 
url="jdbc:oracle:thin:@(DESCRIPTION = 
(ADDRESS = (PROTOCOL = TCP)(HOST = dbservernameorip)(PORT = 9999))
(CONNECT_DATA = (SERVER = DEDICATED) 
(SERVICE_NAME = dbSIDorservicename)))"
username="user" 
password="pwd" 
maxActive="35"
maxIdle="10"
maxWait="20000"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="3600000"
timeBetweenEvictionRunsMillis="1800000"
testOnBorrow="true"
testOnReturn="false"
/>

Portlet web.xml 包含:

<resource-ref>
    <description>Oracle Datasource example</description>
    <res-ref-name>jdbc/NewPool</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

查找代码为:

String JNDI = "jdbc/NewPool"
_log.debug("JNDI Name  is: " + JNDI);
_log.debug("dataSource in dbConnect is :" + dataSource);
Context context = new InitialContext();
Context envContext  = (Context)context.lookup("java:/comp/env");
_log.debug("envContext in dbConnect is :" + envContext);
try {
  DataSource ds = (DataSource)envContext.lookup(JNDI);

Liferay 可以成功使用 context.xml 资源与 Liferay Oracle 数据库类似的数据源。

Liferay portlet 是否需要一些其他连接来建立与另一个数据库的连接?

无需 web.xml 更改即可在 weblogic 上运行相同的 portlet 代码。类似的 JNDI 数据源查找代码和配置适用于 vanilla tomcat(没有 liferay)和普通 war(非 liferay portlet)文件。

更新:

我已经使用 netstat -an|grep dbport 检查了服务器上的数据库连接。这没有显示已建立的连接。

我也试过在 portal-ext.properties 中设置 portal.security.manager.strategy=none。这也没有用。

非常感谢任何见解,因为我们有点被困在这里。

谢谢!

我们在使用资源和池时也遇到了一些问题。由于我们要处理的请求很少,而且性能不是我们场景的关注点,我们直接使用了 JDBC 连接,没有池,它工作正常(我们正在连接到 MS Sql 服务器)

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String url = "jdbc:jtds:sqlserver://host/dbname";
String driver = "net.sourceforge.jtds.jdbc.Driver";
String db_userName = PropsUtil.get("jdbc.default.username");
String db_password = PropsUtil.get("jdbc.default.password");

try {
    Class.forName(driver);
    conn = DriverManager.getConnection(url, db_userName, db_password);

    String sql = "SELECT * FROM Users";
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
    while(rs.next()){
        // DO WHAT YOU WANT
        return true;
    }
    rs.close();
}catch(SQLException se){
    //Handle errors for JDBC
    se.printStackTrace();
}catch(Exception e){
    //Handle errors for Class.forName
    e.printStackTrace();
}finally{
    //finally block used to close resources
    try{
        if(stmt!=null)
            conn.close();
    }catch(SQLException se){
    }// do nothing
    try{
        if(conn!=null)
            conn.close();
    }catch(SQLException se){
        se.printStackTrace();
    }//end finally try
}//end try

它工作正常。用户名和密码在 portal-ext.properties 中配置(我们使用与 liferay 自己的数据库相同的帐户)

希望对您有所帮助

我刚刚在 Liferay 论坛中偶然发现了这个帖子,基本上是这样说的。把这个放在你的 tomcat/conf/server.xml

<GlobalNamingResources>
<!-- Editable user database that can also be used by
     UserDatabaseRealm to authenticate users
-->
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>

<Resource name="jdbc/XXX" auth="Container" type="javax.sql.DataSource"
          maxActive="20" maxIdle="10" maxWait="5000"
          removeAbandoned="true" removeAbandonedTimeout="250" validationQuery="SELECT 1"
          username="user2" password="pwd2"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost/myOtherDb"/>    

这在你的 context.xml:

<ResourceLink name="jdbc/XXX" global="jdbc/XXX" type="javax.sql.DataSource">

它应该可以解决问题。如果您真的问为什么 Liferay 可以找到 jndi 资源,但找不到您的 portlet: 我不知道...

我相信我们找到了我们的问题。好像打错了。

所有对数据源的引用都需要更改为 ds。代码已更改。原来在解决问题时声明了 ds 变量后,变量名并没有在代码中更改为 ds。

String JNDI = "jdbc/NewPool"
_log.debug("JNDI Name  is: " + JNDI);
_log.debug("dataSource in dbConnect is :" + ds);
Context context = new InitialContext();
Context envContext  = (Context)context.lookup("java:/comp/env");
_log.debug("envContext in dbConnect is :" + envContext);
try {
  DataSource ds = (DataSource)envContext.lookup(JNDI);
_log.debug("dataSource in dbConnect is :" + ds)

我们需要对此进行测试。我会post期末考试后的结果。