当前位置: 首页 > 知识库问答 >
问题:

以编程方式为Postgres JDBC生成“DataSource”对象

赵俊远
2023-03-14

JDBC教程建议使用DataSource对象来获得数据库连接,而不是使用DriverManager类。要引用“连接数据源对象”页面,请执行以下操作:

获取数据源连接的首选方式。

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

现在,我不想像这样摆弄JNDI。

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

共有1个答案

江宏伟
2023-03-14

PGSimpleDataSource类与JDBC驱动程序捆绑在jdbc.postgresql.org实现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驱动程序可以为您提供DataSource接口的实现。

此实现的对象包含建立和配置到数据库的连接所需的信息,例如:

  • 名称

最多可提供三种实施方式:

  • 这种实现通常是DriverManager的薄包装。每次对这样一个实现的对象调用DataSource::getConnection,都会得到一个新的数据库连接

来自jdbc的开源免费驱动程序。postgresql。org提供所有三种类型的DataSource实现。但作者不建议在生产中实际使用它们的连接池类型;如果需要池,请使用第三方连接池库。我们忽略了XA类型。

因此,让我们看看DataSource的简单的每次刷新连接实现:org.postgresql.ds.PGSimpleDataSource

实例化一个空对象,然后调用一系列setter方法为您的特定数据库场景进行配置。setter方法继承自org。postgresql。ds。常见的BaseDataSource

我们还没有升级到接口数据源,以便调用各种setter方法。请参阅数据源和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?

通常我会使用这些单独的html" target="_blank">setter方法。或者,您可以构造一个字符串,一个URL,其中包含要在数据源上一笔设置的各种信息。如果你想走那条路线,请调用setUrl

这涵盖了基本内容。但是你可能想要或者需要一些其他的setter。其中大多数是在服务器上设置Postgres属性值。所有属性都具有智能默认值,但您可能希望在特殊情况下覆盖。

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方法的Postgres属性,您可以调用setProperty(PGProperty属性,字符串值)

您可以通过调用许多getter方法中的任何一种来检查或验证此数据源上的设置。

配置PGSimpleDataSource后,您可以将其作为DataSource对象传递到代码库的其余部分。这将使您的代码库免受更改为另一个数据源实现或更改为另一个JDBC驱动程序的冲击。

DataSource dataSource = ds ;  // Upcasting from concrete class to interface.
return dataSource ; 

使用DataSource非常简单,因为它只提供了两种方法,即getConnection上的一对变体,用于为数据库工作获取Connection对象。

Connection conn = dataSource.getConnection() ; 

完成连接后,最佳做法是确保将其关闭。可以使用try with resources语法自动关闭连接,也可以显式关闭连接。

conn.close() ;

请记住,数据源实际上不是数据源。数据源实际上是生成/访问数据库连接的源。在我看来,这是一个误称,因为我认为它是ConnectionSourceDataSource与您的数据库对话的时间仅足以使用用户名和密码登录。登录后,使用连接对象与数据库交互。

一旦配置好,您希望将数据源对象保持在缓存状态。无需重复重新配置。实现应该是线程安全的。您可以随时随地调用getConnection

对于一个简单的小Java应用程序,您可能希望将其存储为单例或静态全局变量中的字段。

对于基于Servlet的应用程序(如Vaadin应用程序),您将创建一个实现ServletContextListener接口的类。在该类中,当web应用程序启动时,您将建立数据源对象。从那里,通过传递到setAttribute将对象存储在ServletContext对象中<代码>上下文是“web应用”的技术术语。通过调用getAttribute并强制转换到DataSource进行检索。

在企业场景中,数据源可以存储在符合JNDI的实现中。一些Servlet容器(如ApacheTomcat)可能提供JNDI实现。有些组织使用服务器,如LDAP服务器。登记

 类似资料:
  • 问题内容: 给定2种rgb颜色和一个矩形区域,我想在这些颜色之间生成基本的线性渐变。我已经进行了快速搜索,唯一能够找到的是此Blog条目,但示例代码似乎丢失了,或者至少是在发布此信息之时。任何帮助,算法,代码示例,等等。这将用Java编写,但是显示层已经处理完毕,我只需要弄清楚如何弄清楚要显示的内容。 问题答案: 您需要在第一和第二种颜色之间进行插值。通过为每个分量(R,G,B)计算相同的插值,可

  • 问题内容: 我使用eclipse在最初独立于eclipse创建的应用程序上工作。因此,该应用程序的目录结构绝对不适合日食使用。 我想以编程方式为该应用程序生成一个项目。在和文件是很容易的弄清楚,我已经了解到,项目存储在工作区下 不幸的是,这里的某些文件(尤其是)似乎是以某种二进制格式编码的。直觉上,我尝试使用-没有骰子反序列化它。因此,它似乎不是序列化的Java对象。 我的问题是:有没有一种方法可

  • 问题内容: 有没有人使用基于Java的库来生成excel文档?最好支持2003年? 问题答案: 我目前正在使用非常全面的Apache POI(http://poi.apache.org/index.html)。2003文件格式版本仍处于beta版本,但似乎运行良好。我并没有很好地利用它的功能,只是对Excel进行简单的读写,但这似乎是可靠的。

  • 问题内容: 使用Spring Boot我可以用以下方法实例化一个: 码: 特性: 这将创建一个数据源类: 如何以编程方式设置DataSource用户名/密码? 我们有一项政策,不要以纯文本形式存储凭据,我必须在工作的地方使用特定的凭据提供程序。 问题答案: 您可以使用,如果你使用的是首发。另外,为了覆盖默认的自动配置Bean,您需要将Bean标记为 就我而言,我具有以prefix 开头的属性。 例

  • 问题内容: 我有一个奇怪的问题。我试图以编程方式将dataSource分配给表。 我已使用界面生成器在ViewController中为其创建了一个和IBOutlet。我创建了一个实现的类。我将表的设置为dataSource的实例。一切都会编译并正常运行,直到设置dataSource的行在运行时执行。 错误是并且定义线突出显示。 有什么想法为什么我得到这个运行时错误?我正在Swift中使用XCode

  • 代码: 属性: 这将创建一个类为的数据源