草庐IT

java - 是否有多个 JdbcTemplate 实例?

coder 2023-05-11 原文

据我了解,DataSourceJdbcTemplates 都是 threadsafe,所以 您可以配置 的单个实例>JdbcTemplate 然后安全地将这个共享引用注入(inject)到多个 DAO(或存储库)中DataSource也应该是 Spring 单例,因为它管理连接池。

官方Spring Documentation JdbcTemplate best practices解释了替代方案(手册的摘录用斜体表示,方括号内是我的注释:

  • 在你的 Spring 配置文件中配置一个 DataSource,然后将共享的 DataSource bean 依赖注入(inject)到你的 DAO 类中; JdbcTemplate 是在 DataSource 的 setter 中创建的。 [使用 XML 配置,这会导致多个 JdbcTemplate 实例,因为在数据源 setter 中有 new JdbcTemplate(dataSource)]
  • 对依赖注入(inject)使用组件扫描和注释支持。在这种情况下,您使用 @Repository 注释类(这使其成为组件扫描的候选对象)并使用 @Autowired 注释 DataSource setter 方法。 [这种情况也会导致多个 JdbcTemplate 实例]
  • 如果您使用 Spring 的 JdbcDaoSupport 类,并且您的各种 JDBC 支持的 DAO 类从它扩展,那么您的子类从 JdbcDaoSupport 类继承 setDataSource(..) 方法。你可以选择是否继承这个类。 JdbcDaoSupport 类只是为了方便而提供的。 [由于每个扩展它的类都有一个 JdbcDaoSupport 实例,因此派生类的每个实例也有一个 JdbcTemplate 实例(参见 source code for JdbcDaoSupport)]

但是,稍后的说明不鼓励刚才提出的所有选项:

Once configured, a JdbcTemplate instance is threadsafe. You may want multiple JdbcTemplate instances if your application accesses multiple databases, which requires multiple DataSources, and subsequently multiple differently configured JdbcTemplates.

换句话说,刚刚提供的所有选项都将导致拥有多个 JdbcTemplate 实例(每个 DAO 一个),并且就在文档说使用单个数据库时没有必要之后。

我要做的是直接将 JdbcTemplate 注入(inject)到需要它的各种 DAO,所以我的问题是,这样做可以吗?而且,您是否也认为 Spring 引用文档是自相矛盾的?还是我的误会?

最佳答案

IMO,将 JdbcTemplate 注入(inject)您的(多个)DAO 没有问题。当您需要运行数据库查询时,该模板用于将您的 DAO“连接”到物理资源(数据库连接)。因此,如果 SessionFactory 和 TransactionManager 配置正确,您将不会遇到并发问题 - Spring 管理您使用持久层所需的 bean 的生命周期。使用模板的优点是:

  1. JDBC 模板管理自动与数据库交互所需的物理资源,例如创建和释放数据库连接。
  2. Spring JDBC 模板将标准 JDBC SQLExceptions 转换为 RuntimeExceptions。这使您可以更灵活地对错误使用react。 Spring JDBC 模板还将供应商特定的错误消息转换为更易于理解的错误消息

关于java - 是否有多个 JdbcTemplate 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9460507/

有关java - 是否有多个 JdbcTemplate 实例?的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  6. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  7. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  8. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  9. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  10. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

随机推荐