JDBC连接Oracle数据库的URL字符串格式

54

我是Java相关Web开发的新手,但我无法让一个简单的JDBC程序运行。我正在使用现成的Oracle 10g XE和Eclipse EE IDE。到目前为止,根据查看的书籍和网页,我已经将问题缩小到错误编写的数据库URL或缺少JAR文件之一。我遇到了如下错误:

java.sql.SQLException:未找到适当的驱动程序以用于jdbc:oracle://127.0.0.1:8080

以下是代码:

import java.sql.*;

public class DatabaseTestOne {
    public static void main(String[] args) {
        String url = "jdbc:oracle://127.0.0.1:8080";
        String username = "HR";
        String password = "samplepass";

        String sql = "SELECT EMPLOYEE_ID FROM EMPLOYEES WHERE LAST_NAME='King'";
        Connection connection;
        try {
            connection = DriverManager.getConnection(url, username, password);
            Statement statement = connection.createStatement();
            System.out.println(statement.execute(sql));
            connection.close();
        } catch (SQLException e) {
            System.err.println(e);
        }
    }
}

数据库URL的正确格式是什么?虽然它们经常被提到,但我找不到描述。

编辑(解决方法):

根据duffymo的回答,我从Oracle下载站点获取了ojdbc14.jar并将其放入Eclipse项目的“Referenced Libraries”中。然后,我更改了代码的开头:

...
// jdbc:oracle:thin:@<hostname>:<port>:<sid>
String url = "jdbc:oracle:thin:@GalacticAC:1521:xe";
...

然后它起作用了。

8个回答

64

有两种方式来设置这个。如果你有SID,使用这种(更旧的)格式:

jdbc:oracle:thin:@[HOST][:PORT]:SID

如果您有一个Oracle服务名称,请使用这个(更新的)格式:

jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

来源: 此OraFAQ页面

getConnection()方法的调用是正确的

同时,像duffymo所说的那样,确保实际的驱动程序代码存在于类路径中,可以通过在类路径中包含ojdbc6.jar来实现,其中数字对应于您正在使用的Java版本。


4
我强烈建议使用新格式!旧格式只能连接一个特定的数据库实例,如果您选择稍后创建数据库集群(例如为了可扩展性),则必须引入另一个连接字符串才能连接到任何其他节点。服务提供了灵活性,尤其是针对Oracle RAC环境。使用/SERVICE而不是:SID可以获得计划停机、协调连接和基于服务的性能分析。数据库默认在安装时创建与数据库名称相等的服务。 - gvenzl

51

请点击这里查看。

你的URL有误,应该像这样:

url="jdbc:oracle:thin:@localhost:1521:orcl"
你也不需要注册驱动类。你需要下载thin driver JAR文件,将其放入CLASSPATH中,并让你的代码像这样this
更新: "ojdbc14.jar" 中的“14”代表JDK 1.4。您应该将驱动程序版本与正在运行的JDK匹配。 我打赌那意味着JDK 5或6。

只是想更新一下,文档貌似已经移动到这里了:http://docs.oracle.com/cd/E11882_01/appdev.112/e13995/oracle/jdbc/OracleDriver.html。顶部投票答案中提供的链接现在会重定向到 404 页面。 - DannyRosenblatt
3
使用SIDs的连接字符串已经相当过时了。使用服务名称可以给数据库管理员提供更多的灵活性(例如,在一个数据库实例上托管多个服务(合并)或者为一个服务使用多个实例(RAC))。请参考@Pops的回答。 - Colin 't Hart
考虑到这个问题已经快五年了,我想说这并不奇怪。 - duffymo
我的JDK版本是1.7,但最新的JDBC版本是6而不是7。这会造成任何问题吗?http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html - Niko Bellic
也许。我想要将它们同步起来。https://community.oracle.com/thread/2611952?tstart=0 - duffymo

22
正确的URL格式可以是以下格式之一:
jdbc:oracle:thin:@<hostName>:<portNumber>:<sid>;  (if you have sid)
jdbc:oracle:thin:@//<hostName>:<portNumber>/serviceName; (if you have oracle service name)

不要在那里放置任何空格。 尝试使用1521作为端口号。 sid(数据库名称)必须与环境变量中的数据库名称相同(如果您正在使用Windows)。


1
这个涉及两个数据库。这个答案应该有更多的赞。我给你点一个。 - bibliophilsagar

5

如果您使用的是Oracle 10g Express Edition,则应按以下方式进行操作:
1. 加载类时,请使用以下代码: DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); 2. 连接到数据库时,请使用以下代码: Connection conn = DriverManager.getConnection("jdbc:oracle:thin:username/password@localhost:1521:xe");


3
以下是 Oracle 支持的有效 JDBC URL:
使用 Oracle JDBC 驱动程序(oracle.jdbc.pool.OracleDataSource)进行连接:
String url = "jdbc:oracle:thin:@tcp://my-host:1522/my-service";
OracleDataSource ods = new OracleDataSource();
ods.setUser(userName);
ods.setPassword(password);
ods.setURL(url);
Connection con = ods.getConnection();

Oracle JDBC驱动程序支持以下URL格式:

  • EZConnect格式

    从19c开始,连接属性可以添加到URL的末尾。 语法使用“?”表示连接属性的开始,“&”作为每个属性之间的分隔符。

    语法

    jdbc:oracle:thin:@[[protocol:]//]host1[,host2,host3][:port1][,host4:port2] [/service_name][:server_mode][/instance_name][?connection properties]

    示例:

    • jdbc:oracle:thin:@mydbhost:1521/mydbservice
    • jdbc:oracle:thin:@tcp://mydbhost:1521/mydbservice
    • jdbc:oracle:thin:@tcp://mydbhost1,mydbhost2:1521/mydbservice
    • jdbc:oracle:thin:@tcp://mydbhost1:5521,mydbhost2:1521/mydbservice
    • jdbc:oracle:thin:@tcp://mydbhost1:5521/mydbservice:dedicated
    • jdbc:oracle:thin:@mydbhost1:5521/mydbservice?oracle.net.httpsProxyHost=myproxy&oracle.net.httpsProxyPort=80
    • jdbc:oracle:thin:@tcps://mydbhost1:5521/mydbservice?wallet_location=/work/wallet
    • jdbc:oracle:thin:@tcps://mydbhost1:5521/mydbservice?wallet_location=/work/wallet&ssl_server_cert_dn="Server DN"
  • TNS URL格式

    这种格式是指定连接选项的更结构化和更描述性的方式。

    语法

    jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=<protocol>) (HOST=<dbhost>)(PORT=<dbport>)) (CONNECT_DATA=(SERVICE_NAME=<service-name>))

    示例:

    • jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=mydbhost)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=mydbservice))
    • jdbc:oracle:thin:@(DESCRIPTION= (LOAD_BALANCE=on) (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host1) (PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=5221))) (CONNECT_DATA=(SERVICE_NAME=orcl)))
    • jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS= (PROTOCOL=TCPS)(PORT=1522)(HOST=myhost)) (CONNECT_DATA=(SERVICE_NAME=dbservicename)) (SECURITY=(ssl_server_cert_dn="CN=testcert.test.com, O=org,L=somecity,ST=state,C=US")))
  • TNS别名格式

    要使用在tnsnames.ora中配置的别名,请使用以下格式。 tnsnames.ora文件的位置可以使用TNS_ADMIN参数进行配置。

    语法

    jdbc:oracle:thin:@<alias_name>

    示例:

    • jdbc:oracle:thin:@prod_db?TNS_ADMIN=/work/tns/
    • jdbc:oracle:thin:@inst1?TNS_ADMIN=/work/tns/

1
String host = <host name>
String port = <port>
String service = <service name>
String dbName = <db schema>+"."+service
String url = "jdbc:oracle:thin:@"+host+":"+"port"+"/"+dbName

0
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());         
connection = DriverManager.getConnection("jdbc:oracle:thin:@machinename:portnum:schemaname","userid","password");

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接