我们的应用程序适用于 MySQL、MS SQL Server 和 Oracle 数据库。
我们的 C3P0 配置使用 preferredTestQuery 选项来测试连接性。这是我们的 Spring 配置
<b:bean id="phoenixDataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<b:property name="driverClass" value="${database.driver}"/>
<b:property name="jdbcUrl" value="${database.connectionURL}"/>
<b:property name="user" value="${database.user}"/>
<b:property name="password" value="${database.password}"/>
<b:property name="initialPoolSize"><b:value>${database.initialPoolSize:10}</b:value></b:property>
<b:property name="minPoolSize"><b:value>${database.minPoolSize:1}</b:value></b:property>
<b:property name="maxPoolSize"><b:value>${database.maxPoolSize:25}</b:value></b:property>
<b:property name="acquireRetryAttempts"><b:value>${database.acquireRetryAttempts:10}</b:value></b:property>
<b:property name="acquireIncrement"><b:value>${database.acquireIncrement:5}</b:value></b:property>
<b:property name="idleConnectionTestPeriod"><b:value>${database.idleConnectionTestPeriod:60}</b:value></b:property>
<b:property name="maxIdleTime"><b:value>${database.maxIdleTime:10800}</b:value></b:property>
<b:property name="maxConnectionAge"><b:value>${database.maxConnectionAge:14400}</b:value></b:property>
<b:property name="preferredTestQuery"><b:value>${database.preferredTestQuery:SELECT 1}</b:value></b:property>
<b:property name="testConnectionOnCheckin"><b:value>${database.testConnectionOnCheckin:false}</b:value></b:property>
<b:property name="testConnectionOnCheckout"><b:value>${database.testConnectionOnCheckout:false}</b:value></b:property>
</b:bean>
SELECT 1 不是 Oracle 的有效查询,但是 SELECT 1 FROM DUAL 不是 SQL Server 的有效查询,除非我们创建一个 DUAL 对象。
非常简单的问题:是否有任何 SELECT 或只是无害 查询可以在所有平台上普遍用于测试连接性?
我可以在 Oracle 安装的属性文件中覆盖 database.preferredTestQuery,但我仍然想知道是否有可行的通用解决方案。
[编辑] C3P0 独立于我的代码进行连接检查。当查询失败时(如果启用了调试日志记录),它会在日志中写入错误。我的代码没有使用该查询,它是 C3P0 配置的一部分,因为该工具会自行检查连接是否已建立(据我所知)。那我不能做 if-else。目前,仅通过配置来覆盖 Oracle 安装的查询是可行的。
顺便说一句,即使我可以通过代码测试方言实现,这个问题也可以改写为“为了测试连接性,我可以运行通用查询还是我必须运行特定于 DBMS 的无害查询?”或类似的东西
最佳答案
harmless query that can be universally used on all platforms to test connectivity?
只是测试连通性?我认为您的 SELECT * FROM DUAL 在所有三个数据库中都应该没问题,以测试连接性。在 SQL Server 中,您会收到错误消息 Invalid object name ‘dual’.。这意味着您已连接到数据库,但它返回了一个错误,指出该表不存在。
因为,如果你没有连接,你会得到一个不同的错误,而不是表不存在的标准错误堆栈。
幸运的是,如果在 SQL Server 中创建一个名为 dual 的表,那就太好了。
但我想知道,在您的代码中使用 IF-ELSE 条件来检查数据库连接并针对不同的数据库进行不同的查询有多困难。
我认为大多数在后端使用多个数据库产品的应用程序都定义了一些属性来检查连接。
关于mysql - 用于测试连接性的通用 SELECT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29818881/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test