不是Java专家 - 实际上,正在处理将导致新项目的遗留项目。也就是说,目前正在尝试创建旧项目并连接到测试数据库。我可以通过Netbeans Services面板或通过SQLDeveloper直接连接。
正在使用的服务器目前是Apache Tomcat 7.0.42。
Oracle JDBC驱动程序是ojdbc7.jar - 我知道,很老,但是为了通过这个文件获得连接,它包含在源代码中。
Java平台是JDK 1.7,虽然这是我的Netbeans副本的默认设置 - 再次,这是一个非常古老的项目,我相信它使用的是DTD Web应用程序2.3,所以我甚至可能使用错误的JDK编译,尽管我只看到我应该能够忽略的折旧和限制警告(它们似乎更多地存在于源包中,而不是在项目的这个方面。)
项目本身应该一直在运行 - 我通过版本控制将其拉下来。
由于源代码不包含JNDI的实际配置,我不得不做我的研究(用于常规MySQL数据库连接;这个JNDI世界对我来说是全新的。) - 我最终找到了以下内容建议修改server.xml(在Tomcat上)和context.xml(在web应用程序中)的链接。 http://www.microdeveloper.com/html/JNDI_Orcl_Tomcat1p.html - 尽管如此,我不确定这是否是开始配置数据源的正确方法。
SERVER.XML
<Resource name="jdbc/travel"
aunt="Container"
type="oracle.jdbc.pool.OracleDataSource"
driverClassName="oracle.jdbc.OracleDriver"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
url="jdbc:oracle:thin:@//dbname.host.com:1521/servicename.host.com"
user="travel"
password="password"
maxActive="20"
maxIdle="10"
maxWait="-1"
/>
context.xml中
<ResourceLink global="jdbc/travel" name="jdbc/travel" type="oracle.jdbc.pool.OracleDataSource"/>
Web.xml(不确定是否需要)
<resource-ref>
<description>Travel</description>
<res-ref-name>jdbc/travel</res-ref-name>
<res-type>oracle.jdbc.pool.OracleDataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
我不确定我是否正确使用type,auth或factory(也必须从上面的链接更改driverClassName) - 当我在NetBeans中测试连接时,oracle.jdbc.OracleDriver列出的属性为驱动程序名字。)为了进一步让我感到困惑,我不确定我理解为什么网址在// @或@服务如何工作之后仍然包含@但这只需要我的研究结果。我应该打的模式叫做travel(就像用户名一样)。
我不一定要包括实际启动连接的类,因为它们很长并且调用许多其他类(不同的数据库取决于配置,不同的工具,架构,表等)我可以包括方法但是在我的Jdbc类中(省略了log4j的东西):
private transient Connection conn ;
private transient ResultSet rs ;
private transient Statement stmt ;
private transient Context initContext = null;
private DataSource ds = null;
private String jndiName = null;
public Jdbc( )
{
super ( ) ;
} ;
public Jdbc( final String _jdniName ) throws TravelException , InstantiationException , IllegalAccessException , ClassNotFoundException
{
super ( ) ;
this.jndiName = _jdniName;
}
public void connectToDatabase( ) throws TravelException
{
try
{
this.disconnectFromDatabase ( ) ;
if (this.ds==null)
{
this.initContext = new InitialContext();
Context envCtx = (Context) initContext.lookup("java:comp/env");
this.ds = (DataSource) envCtx.lookup(this.jndiName);
}
this.conn = this.ds.getConnection ( );
}
catch ( final Exception e )
{
this.conn=null ;
throw new TravelException ( e ) ;
}
}
...
我不确定这是导致问题的环境还是我的XML配置 - 我一直打的错误是:
java.sql.SQLException: Io exception: Message file 'oracle.net.mesg.Message' is missing.
这似乎指出了一个根本没有报告的问题 - 我假设它实际上没有连接到服务器。
如果需要更多详细信息,我很乐意尽我所能 - 如果这类问题不适合Stack Overflow M.O.,我很抱歉 - 在我的机智结束时我很抱歉!
总结一下我的问题 - 我无法通过我的代码连接到Oracle 10g数据库,但是,我可以使用SQLDeveloper或Netbeans中的服务面板直接连接相同的URL和登录信息 - 我相信我的问题在于我对Web应用程序的XML配置,但我不确定我哪里出错了。即使我不再在我的编译时库中包含oracle jar,我似乎也得到了相同的错误消息,这很奇怪,因为我可以在IDE中看到我的Library文件夹中的jar时 - 奇怪的是在我的Tomcat文件夹中,它无处可寻。也许问题是驱动程序没有正确包含在内?
答案 0 :(得分:0)
原来这是一个IDE问题 - 如上所述,JDBC驱动程序没有传递给服务器。我最终关闭了服务器并关闭了Netbeans - 从那里我启动了Eclipse并在不同的Tomcat实例中测试了应用程序 - 服务器启动都很好。关闭它然后回到Netbeans;服务器正在运行。