我正在使用Confluence Script Plugin在Confluence中编写Jython宏。我有一些代码,最近在升级到Confluence和插件后停止工作。我已经尝试了在SO和网络上找到的各种可能的解决方案而没有任何运气。
我正在尝试连接到Oracle数据库以查询某些值。这是我的代码:
import sys
from oracle.jdbc.driver import OracleDriver
from java.sql import DriverManager, SQLRecoverableException
def connect(user, pw, sid, host, port):
connection = None
DriverManager.registerDriver(OracleDriver())
try:
connection = DriverManager.getConnection("jdbc:oracle:thin:@"+host+":"+port+":"+sid, user, pw)
except SQLRecoverableException, e:
print 'ERROR: Cannot connect to database %s %s %s: %s.' % (host, port, sid, e)
except:
print 'ERROR: Cannot connect to database %s %s %s: %s.' % (host, port, sid, sys.exc_info()[1])
return connection
conn = connect(db_user, db_pw, db_sid, db_host, db_port)
运行此操作会导致以下错误(注意:删除了真实的主机名,端口和sid):
ERROR: Cannot connect to database host port sid: java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@host:port:sid.
这个错误让我觉得无法找到ojdbc6.jar或者不在正确的目录中。为了以防万一,我明确地将它添加到类路径中。这仍然无效。将它添加到类路径后,我通过检查进程args验证了类路径是否正确设置,我看到正在catalina.out中处理ojdbc6.jar。 (注意:删除了实际安装路径)
处理参数:
argv[21]: -classpath
argv[22]: :<install_path>/atlassian-confluence-4.3.1/lib/ojdbc6.jar:<install_path>/atlassian-confluence-4.3.1/bin/bootstrap.jar
catalina.out中:
*sys-package-mgr*: processing new jar, '<install_path>/atlassian-confluence-4.3.1/lib/ojdbc6.jar'
我还验证了我们目前正在使用jdk1.6.0_33,因此ojdbc6.jar应该是正确的瘦客户端。有人知道可能导致错误的原因吗?
答案 0 :(得分:0)
我也无法做到这一点。我遵循了Oracle教程(这里:http://www.oracle.com/technetwork/articles/dsl/mastering-oracle-python-providers-1395759.html),然而,当我转而使用上面文章中描述的Oracle调用接口(OCI)方法时,一切都运行得很完美。正如文章所概述的那样,使用OCI有几个优点,例如连接池等。以下代码对我有用:
import sys
import java.sql.SQLException
from oracle.jdbc.pool import OracleDataSource
cs = "jdbc:oracle:thin:@localhost:1521:XE"
ods = OracleDataSource()
ods.setURL(cs)
ods.setUser("hr")
ods.setPassword("hr")
try:
conn = ods.getConnection()
except java.sql.SQLException, e:
print "Problem connecting to \"%s\"" % cs
sys.exit()
stmt = conn.createStatement()
rs = stmt.executeQuery("select * from departments order by 2")
while rs.next():
print rs.getString(2)
rs.close()
stmt.close()
conn.close()