【问题标题】:How do you configure a DataSource in Java to connect to MS SQL Server?如何在 Java 中配置 DataSource 以连接到 MS SQL Server?
【发布时间】:2010-11-07 23:56:53
【问题描述】:

我正在尝试按照 Java 的 JDBC 教程编写一个可以连接到 SQL Server 2008 的 Java 程序。我在建立连接时迷路了。

以下sn-p来自教程:

InitialContext ic = new InitialContext();
DataSource ds = ic.lookup("java:comp/env/jdbc/myDB");
Connection con = ds.getConnection();
DataSource ds = (DataSource) org.apache.derby.jdbc.ClientDataSource()
ds.setPort(1527);
ds.setHost("localhost");
ds.setUser("APP")
ds.setPassword("APP");
Connection con = ds.getConnection(); 

没有解释 comp/env/jdbc/myDB 应该指向什么,我不知道我应该如何选择一个端口。此外,对象 ds 似乎被定义了两次。

我正在使用JSQLDataSource 驱动程序,以作记录。谁能在这里指出我正确的方向?

http://java.sun.com/docs/books/tutorial/jdbc/basics/connecting.html

【问题讨论】:

  • 这些答案有些帮助。如果有人能解释为什么 ds 在 Sun 的教程中定义了两次,我会接受答案。
  • 我正在经历同样的过程!我在看这个页面:docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html 它开始谈论咖啡店!那一刻我放弃了。你必须热爱 java/oracle 文档!
  • 实际上,在过去的五年里,它已经有所改善。与我上次检查相比,它的错误明显减少。 :)

标签: java sql-server datasource


【解决方案1】:

这个问题很久以前就已经回答过了。这个问题是关于 JNDI 查找的。通过查找,您必须查看应用程序服务器日志以查看连接绑定到什么。例如在 Jboss 启动中,我可以看到:

[ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=myDB' to JNDI name 'java:myDB'

使用您查找的 name=myDB

InitialContext ic = new InitialContext();
DataSource ds = ic.lookup("java:myDB");

注意服务器日志和代码如何都指向 JNDI 名称 java:myDB

【讨论】:

    【解决方案2】:

    我不确定上面是否有人真正回答了这个问题。

    我找到了this microsoft sample useful

    里面的关键信息确实是你需要的类是SQLServerDataSource 这基本上是一个配置对象——你可以像这样使用它:

        SQLServerDataSource dataSource = new SQLServerDataSource();
        dataSource.setUser("aUser");
        dataSource.setPassword("password");
        dataSource.setServerName("hostname");
        dataSource.setDatabaseName("db");
    

    然后你会打电话给

    dataSource.getConnection();
    

    获取一个连接对象,它基本上就是你用来与数据库对话的东西。

    使用

    connection.prepareStatement("some sql with ? substitutions");
    

    为触发 sql 做点什么:

    connection.prepareCall
    

    用于调用存储过程。

    【讨论】:

      【解决方案3】:
      DataSource ds = new SimpleDriverDataSource(new com.mysql.jdbc.Driver(),
          "jdbc:mysql://database:1433;databaseName=name", "username", "password");
      JdbcTemplate jdbc = new JdbcTemplate(ds);
      

      【讨论】:

        【解决方案4】:

        JDBC tutorialMicrosoft docs 开头。

        还有这个:

        String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
        Class.forName(driver);
        String url = "jdbc:microsoft:sqlserver://host:1433/database";
        Connection conn = DriverManager.getConnection(url, "username", "password");
        

        填写主机、数据库、用户名和密码的值。 SQL Server 的默认端口是 1433。

        更新:下面的好点。 JDBC 驱动程序可以从 Microsoft 和 jTDS 获得。我更喜欢后者。

        JNDI 查找与支持连接池的 Java EE 应用服务器有关。您可以要求应用程序服务器创建一个连接池,这可能是一件昂贵的事情,并根据需要将它们借给图书馆书籍等客户端。

        如果您不使用 Java EE 应用服务器或连接池,则必须自行创建连接。这就是手动流程和 DriverManager 发挥作用的地方。

        解释:至于 Sun 教程为什么显示 DataSource 两次,我会说这是一个糟糕的编辑案例。如果您查看上面的代码示例,它说您可以“通过查找或手动”获取数据源。下面的代码 sn-p 将两者一起显示,什么时候应该是其中一个。

        您知道这是一个无意的错误,因为编写的代码无法编译。您已经声明了两次“ds”。

        所以它应该读“...lookup”,然后是它的代码sn-p,然后是“...manually”,然后是它的代码sn-p。

        【讨论】:

        • 好吧,我正忙于一件非常简单的事情。 “主人”可能是什么?这是通往 MSSQL 程序的路径吗?
        • "host" 是运行 SQL Server 的服务器的名称或 IP 地址(例如,“localhost”或“127.0.0.1”。
        • 知道如何使用数据源而不是驱动程序管理器吗?从阅读introductory documentation 看来,这是推荐的方式。我也看到有人说你也不需要使用 Class.forname 了。不知道这样做的动机是什么
        • 介绍性文档通常假设您没有 Java EE 应用服务器,因为编写自己的 Java 类肯定更简单。不需要 Class.forName() 是 JDK 中的一个较新功能(我相信 7 和更新版本)。 “动机”是 JDK 的变化。
        • 只是补充一点:jTds 虽然是一个不错的选择,但不再维护,自 2013 年以来没有更新,并且不兼容 JDBC 4.0。部分项目已经切换到 MS 驱动
        【解决方案5】:

        我喜欢用于连接 SQL Server 的 jTDS 驱动程序。

        网址如下所示:

        jdbc:jtds:sqlserver://localhost/Finance;instance=sqlexpress
        

        检查this 以获取 jTDS 网址信息。

        This 也有一些有趣的信息可以帮助解决 jtds to sql express 之类的问题。

        【讨论】:

          猜你喜欢
          • 2012-02-03
          • 2019-06-24
          • 2013-05-27
          • 1970-01-01
          • 2016-07-06
          • 2020-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多