对于访问非liferay Oracle数据库的Liferay 6.2自定义portlet,我们遇到的问题是返回的数据源为null。
我们已经配置了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是否需要与其他数据库建立连接?
相同的portlet代码适用于weblogic而不更改web.xml。类似的JNDI数据源查找代码和配置适用于vanilla tomcat(没有liferay)和普通war(非liferay portlet)文件。
更新
我已经使用netstat -an | grep dbport检查了服务器上的数据库连接。这并没有表明已建立的联系。
我还尝试在portal-ext.properties中设置portal.security.manager.strategy = none。这也不起作用。
我们非常感激任何见解,因为我们有点困在这里。
谢谢!
答案 0 :(得分:1)
我们在使用资源和池时也遇到了一些问题。由于我们处理的请求非常少,并且性能不是我们场景的关注点,因此我们直接使用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自己的数据库的相同帐户)
希望这有帮助
答案 1 :(得分:1)
我刚刚在Liferay论坛中偶然发现了这个主题。在你的tomcat / conf / server.xml
中选择它[1] 1
[1] NA
并在您的context.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"/>
它应该做的伎俩。如果你真的问为什么Liferay可以找到jndi资源,而不是你的portlet: 我不知道......
答案 2 :(得分:1)
我相信我们找到了问题。这似乎是一个错字。
所有对dataSource的引用都需要更改为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)
我们需要对此进行测试。我将在最终测试后发布结果。