Java Can';t通过JDBC连接到Oracle 11g
我正在尝试将JSF应用程序连接到Oracle 11g数据库。不久前,我有一个JSF应用程序以类似的方式与Derby数据库连接。大约在同一时间,我能够通过自己编写的Java程序连接到Oracle 11g数据库 我尝试将代码移植到这个最近的项目中,虽然看起来一切正常,但代码中的连接返回null 为了进一步解决这个问题,当我尝试调试时,NetBeans似乎锁定了。我假设它将使用运行GlassFish 4的端口,但不知怎的,它无法判断其已被占用 感谢您的帮助;请让我知道,如果我可以提供更多的信息,我不知何故忽略了 代码片段如下所示:Java Can';t通过JDBC连接到Oracle 11g,java,oracle,jdbc,oracle11g,Java,Oracle,Jdbc,Oracle11g,我正在尝试将JSF应用程序连接到Oracle 11g数据库。不久前,我有一个JSF应用程序以类似的方式与Derby数据库连接。大约在同一时间,我能够通过自己编写的Java程序连接到Oracle 11g数据库 我尝试将代码移植到这个最近的项目中,虽然看起来一切正常,但代码中的连接返回null 为了进一步解决这个问题,当我尝试调试时,NetBeans似乎锁定了。我假设它将使用运行GlassFish 4的端口,但不知怎的,它无法判断其已被占用 感谢您的帮助;请让我知道,如果我可以提供更多的信息,我不知
@ManagedBean(name="OracleBean")
@RequestScoped
public class OracleBean {
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:thin:@localhost:8081:xe";
private String dbName = "test";
private String dbUsername = "Username";
private String dbPassword = "password";
private Connection connect = null;
private OracleMethods Method;
/**
* Creates a new instance of DataBean
*/
public OracleBean() {
driver = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@localhost:8081:xe";
dbName = "Test";
dbUsername = "Username";
dbPassword = "password";
connect = null;
Method = new OracleMethods();
}
public String getColorData(String rowID, int col) {
connect = Method.getConnection(driver, url, dbName, dbUsername, dbPassword);
if (connect == null) {
return "SQL Error";
}
//结束Bean代码
public class OracleMethods extends JPanel {
private Connection connect = null;
public OracleMethods() {}
public Connection getConnection(String driver, String url, String dbName, String dbUsername, String dbPassword) {
try {
Class.forName(driver).newInstance();
connect = DriverManager.getConnection((url + dbName), dbUsername, dbPassword);
} catch (Exception lex) {
lex.printStackTrace();
}
return connect;
}
我认为您的错误在于您连接了url和dbname,并且它应该只是url,因为您连接到实例xe而不是xeTest 而不是
connect = DriverManager.getConnection((url+dbName), dbUsername, dbPassword);
使用
如上所述-您确定db在端口8081上运行,而不是在标准端口1521上运行。也就是url中的dbname测试或XE。如果您有标准设置,我怀疑它是xe 假设您将oracle驱动程序jar作为外部库,那么下面应该会为您提供一个连接
connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "your_user", "your_password");
经过几次测试并强制部署应用程序几次后(尽管它会显示没有此项的编码更改),以下语法最终起作用:
public OracleBean()
{
driver = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@localhost:1521:xe";
dbName = "Test";
dbUsername = "username";
dbPassword = "password";
connect = null;
Method = new OracleMethods();
}
public String getColorData(String rowID, int col)
{
connect = Method.openConnection(driver, url, dbName, dbUsername, dbPassword);
//结束bean代码
public Connection openConnection(String driver, String url, String dbName, String dbUsername, String dbPassword)
{
try
{
Class.forName(driver);
}
catch (ClassNotFoundException e)
{
System.out.println("Could not load the driver");
}
try
{
connect = DriverManager.getConnection((url), dbUsername, dbPassword);
}
catch(Exception lex)
{
lex.printStackTrace();
}
return connect;
}
您是否收到错误?请张贴
tnsnames.ora
不要在两个位置初始化实例变量。要么在声明中,要么在OracleBean的构造函数中,而不是两者。jar中还有两个OracleDriver
类,一个在oracle.jdbc
中,另一个在oracle.jdbc.driver
中-我很确定您想要的是第一个类,而不是您正在使用的类。@A.L如果没有glassfish锁定,我似乎无法调试,所以我不确定在哪里查找错误。正如您在代码段中所看到的,如果connect对象为null,那么它将向网页返回“SQL错误”,这就是我目前的一个指示。@RomanC我不确定您的意思。我忘记了,当我单独连接到db时,它在端口1521上,但是我仍然无法让JSF使用相同的语法进行连接。所以最后是这个和连接端口?正确引用的是.jar文件、端口、url,并正确使用Netbeans/glassfish来部署项目。
public Connection openConnection(String driver, String url, String dbName, String dbUsername, String dbPassword)
{
try
{
Class.forName(driver);
}
catch (ClassNotFoundException e)
{
System.out.println("Could not load the driver");
}
try
{
connect = DriverManager.getConnection((url), dbUsername, dbPassword);
}
catch(Exception lex)
{
lex.printStackTrace();
}
return connect;
}