gpt4 book ai didi

postgresql - 以编程方式为 Postgres JDBC 生成一个 `DataSource` 对象

转载 作者:行者123 更新时间:2023-11-29 11:21:01 25 4
gpt4 key购买 nike

JDBC Tutorial建议使用 DataSource 对象来获取数据库连接而不是使用 DriverManager类。引用 Connecting with DataSource Objects页面:

DataSource objects … the preferred means of getting a connection to a data source.



我如何为 JDBC 获得这样的对象与 Postgres 的连接?我有一个 JDBC 驱动程序。

现在,我不想像 this 那样摆弄 JNDI。或 this .

我可以实例化一个 DataSource在我的 Java 应用程序中以编程方式?或者我必须实现该 DataSource接口(interface)自己?

最佳答案

tl;博士
PGSimpleDataSource 与来自 jdbc.postgresql.org 的 JDBC 驱动程序捆绑在一起的类实现了 DataSource界面。在 PGSimpleDataSource 中配置您的数据库连接详细信息对象,并作为 DataSource 传递对象。

PGSimpleDataSource ds = new PGSimpleDataSource() ;  
ds.setServerName( "localhost" );
ds.setDatabaseName( "your_db_name_here" );
ds.setUser( "scott" );
ds.setPassword( "tiger" );
根据需要使用该对象与数据库建立连接。使用方便 try-with-resources语法。
try
(
Connection conn = ds.getConnection() ;
)
{ … }
JDBC驱动的实现
您的 JDBC driver可以为您提供 DataSource 的实现界面。
此实现的对象包含建立和配置到数据库的连接所需的信息,例如:
  • 数据库用户名和密码
  • 数据库服务器IP地址和端口号

  • 最多可以提供三种实现方式:
  • 通常这样的实现是围绕 DriverManager 的一个薄包装器。 .每次拨打 DataSource::getConnection 在这种实现的对象上,您将获得一个新的数据库连接。
  • 或者,一个实现可能正在使用 connection pool下面提供已经存在的连接。这些连接被分发并重新 checkin ,就像图书馆中的书籍一样,可以回收以重复使用。
  • 一个实现可能支持 Java Transaction API ,支持X/Open XA ,用于复杂的需求,例如协调跨多个资源(如数据库和消息队列)的事务。不常用,所以我在这里忽略这种类型。

  • 来自 jdbc.postgresql.org 的驱动程序
    来自 jdbc.postgresql.org 的开源免费驱动程序提供所有三种类型的 DataSource实现。但作者不建议实际使用他们的 connection pool type在生产中;如果您想要池,请使用第三方连接池库。我们忽略了 the XA type .
    那么让我们来看看 DataSource 的简单的每次重新连接的实现: org.postgresql.ds.PGSimpleDataSource
    配置数据源对象
    实例化一个空对象,然后调用一系列 setter methods为您的特定数据库方案进行配置。 setter 方法继承自 org.postgresql.ds.common.BaseDataSource .
    我们还没有上传到界面 DataSource ,以便我们可以拨打 various setter methods .请参阅 Data Sources and JNDI 上的示例代码和讨论页。
    PGSimpleDataSource ds = new PGSimpleDataSource() ;  // Empty instance.
    ds.setServerName( "localhost" ); // The value `localhost` means the Postgres cluster running locally on the same machine.
    ds.setDatabaseName( "testdb" ); // A connection to Postgres must be made to a specific database rather than to the server as a whole. You likely have an initial database created named `public`.
    ds.setUser( "testuser" ); // Or use the super-user 'postgres' for user name if you installed Postgres with defaults and have not yet created user(s) for your application.
    ds.setPassword( "password" ); // You would not really use 'password' as a password, would you?
    通常我会使用这些单独的 setter 方法。或者,您可以构造一个字符串,一个 URL,其中包含要在 DataSource 上设置的各种信息。一口气。如果您想走那条路,请调用 setUrl .
    这涵盖了基础知识。但是你可能想要或需要一些其他的二传手。其中大部分是设置 Postgres property服务器上的值。这些属性都有智能默认值,但您可能希望在特殊情况下覆盖。
    ds.setPortNumber( 6787 ) ;  // If not using the default '5432'.
    ds.setApplicationName( "whatever" ) ; // Identify the application making this connection to the database. Also a clever way to back-door some information to the Postgres server, as you can encode small values into this string for later parsing.
    ds.setConnectTimeout( … ) ; // The timeout value used for socket connect operations, in whole seconds. If connecting to the server takes longer than this value, the connection is broken.
    ds.setSocketTimeout( … ) ; // The timeout value used for socket read operations. If reading from the server takes longer than this value, the connection is closed. This can be used as both a brute force global query timeout and a method of detecting network problems.
    ds.setReadOnly( boolean ) ; // Puts this connection in read-only mode.
    如果使用 TLS (以前称为 SSL)来加密数据库连接以防止窃听或恶意操纵,为此使用多个 setter 。
    对于没有特定 setter 方法的任何 Postgres 属性,您可以调用 setProperty( PGProperty property, String value ) .
    您可以通过调用许多 getter 方法中的任何一个来检查或验证此数据源上的设置。
    配置您的 PGSimpleDataSource 后,您可以简单地将 DataSource 传递给代码库的其余部分对象。这使您的代码库免受更改为另一个的冲击 DataSource实现或更改为 another JDBC driver .
    DataSource dataSource = ds ;  // Upcasting from concrete class to interface.
    return dataSource ;
    使用数据源
    使用 DataSource非常简单,因为它仅提供两种方法,即 getConnection 上的一对变体。获得 Connection 您的数据库工作的对象。
    Connection conn = dataSource.getConnection() ; 
    完成您的 Connection 后,最佳做法是确保关闭它。要么使用 try-with-resources syntax自动关闭连接,或显式关闭它。
    conn.close() ;
    请记住,一个 DataSource实际上不是数据源。一个 DataSource确实是生成/访问数据库连接的来源。在我看来,这是用词不当,因为我认为它是 ConnectionSource . DataSource与您的数据库对话的时间仅足以使用用户名和密码登录。登录后,您可以使用 Connection对象与数据库交互。
    存储您的 DataSource配置后,您希望保留该 DataSource对象周围,缓存。无需重复重新配置。 implementation should be written to be thread-safe .您可以拨打 getConnection随时随地。
    对于一个简单的小型 Java 应用程序,您可能希望将其作为字段存储在单例或静态全局变量中。
    对于 Servlet基于应用程序,例如 Vaadin应用程序,您将创建一个实现 ServletContextListener 的类界面。在该类(class)中,您将建立您的 DataSource Web 应用程序启动时的对象。从那里你可以将对象存储在 ServletContext 中。对象通过传递给 setAttribute . Context是“网络应用程序”的技术术语。拨打电话取回 getAttribute并转换到 DataSource .
    在企业场景中, DataSource可能存储在 JNDI 中- 合规的实现。一些 Servlet containersApache Tomcat可以提供 JNDI 实现。一些组织使用服务器,例如 LDAP server .注册和取回您的 DataSource使用 JNDI 的对象在 Stack Overflow 上的许多其他问题和答案中都有介绍。

    关于postgresql - 以编程方式为 Postgres JDBC 生成一个 `DataSource` 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45091981/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com