我有一个基于Web的数据服务的MySQL连接池.当它开始为请求提供服务时,它需要从池中连接才能使用.问题是如果自从使用该特定连接以来已经存在显着的暂停,则服务器可能已经将其计时并且关闭其结束.我希望能够在池管理代码中检测到这一点.
诀窍是:我编码的环境只给我一个非常抽象的API连接.我基本上只能执行SQL语句.我无权访问实际的套接字或直接访问MySQL客户端API.
所以,问题是:我可以在连接上执行哪个最便宜的MySQL语句,以确定它是否正常工作.比如SELECT 1;应该工作,但我想知道是否有更便宜的东西?也许某些东西甚至没有通过网络,但在MySQL客户端库中处理并有效地回答相同的问题?
澄清:我不关心检查MySQL服务器是否正在运行,或者它的数据库配置是否足以回答查询.如果这些事情发生故障,那么服务执行的后续SQL将获取并处理相应的错误.我真的只关心TCP连接是否打开...因为如果服务器关闭它,那么Web服务的SQL将收到一个错误,意味着"只需重新连接并再试一次",这样就不方便了.服务代码的渣土.
关闭:该/* ping */黑客正是那种我一直在寻找的东西,但可惜只能通过JDBC.通过文档阅读该hack,很明显它被放在那里的原因与我想要的完全相同.对于好奇,我在Haskel工作,使用HDBC和HDBC-mysql.我将要求HDBC-mysql的作者添加一种mysql_ping()直接或通过类似黑客调用的方法.
Vlad's DO 1也是我追求的那种东西,而且由于另一个hack在JDBC之外是不可用的,我将使用它.
感谢所有精彩的讨论,特别是@Vlad!
随着Ruby的ActiveRecord的或续集,你可以逐步建立SQL查询,添加where或join或order条款,这取决于在运行时条件的查询.
这是一个简单的例子,取自ASCIIcasts:
def index
@articles = Article.order('name')
if params[:hidden]
@articles = @articles.where(:hidden =>(params[:hidden] == "1"))
end
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @articles }
end
end
Run Code Online (Sandbox Code Playgroud)
该示例显示了articles如果HTTP请求查询参数名为hiddenequals,WHERE子句如何附加到表上的基础SQL查询1.
我一直在Haskell中看HDBC和postgresql-simple.似乎postgresql-simple故意使得从动态连接的部分构建SQL查询变得困难,以防止SQL注入.HDBC似乎足够灵活,可以根据运行时的条件构建不同结构的SQL查询,但它似乎没有提供ActiveRecord或Sequel提供的抽象级别.
任何人都可以建议使用其中一个Haskell数据库模拟ActiveRecord的动态查询构建工具吗?
如果HDBC是要走的路,我很好.但是可以理解插图.
我想我正在寻找的是能够针对PostgreSQL后端动态组合查询.
我是一名学习Haskell的Java程序员.
我在一个小型网络应用程序上工作,该应用程序使用Happstack并通过HDBC与数据库进行通信.
我编写了select和exec函数,我就像这样使用它们:
module Main where
import Control.Exception (throw)
import Database.HDBC
import Database.HDBC.Sqlite3 -- just for this example, I use MySQL in production
main = do
exec "CREATE TABLE IF NOT EXISTS users (name VARCHAR(80) NOT NULL)" []
exec "INSERT INTO users VALUES ('John')" []
exec "INSERT INTO users VALUES ('Rick')" []
rows <- select "SELECT name FROM users" []
let toS x = (fromSql x)::String
let names = map (toS . head) rows
print names …Run Code Online (Sandbox Code Playgroud) 我尝试使用HDBC-sqlite3 haskell库启用外键.这个库使用了一个小辅助c函数
int sqlite3_open2(const char *filename, finalizeonce **ppo)
Run Code Online (Sandbox Code Playgroud)
它依次调用sqlite3_open.在sqlite文档中,我发现了一个很好的sqlite3_db_config函数,可以启用外键.为了测试它,我已经快速添加了2行sqlite3_open2(最后两个列表):
int sqlite3_open2(const char *filename, finalizeonce **ppo) {
sqlite3 *ppDb;
finalizeonce *newobj;
int res, *resFK, resFK1;
fprintf(stderr, "DB pointer: %d\n", ppDb);
res = sqlite3_open(filename, &ppDb);
resFK1 = sqlite3_db_config(ppDb, 1002, 1, resFK);
fprintf(stderr, "\nForeign Keys: ON/OFF:%d ERR:%d\n", resFK, resFK1);
...
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是结果:Foreign Keys: ON/OFF:0 ERR:1.
有人能给我一个暗示我做错了什么或者什么是启用外键的正确方法?
我正在尝试将时间戳加载到mysql中.我所有的时间都是UTCTime对象.HDBC mysql实现似乎不喜欢UTCTime对象,尽管内部文档说它将所有时间都视为UTC时间.我相信我需要将UTCTime转换为EpochTime,因为它看起来像HDBC mysql实现支持绑定SqlEpochTime.我无法弄清楚如何获取我的UTCTime并从中获取EpochTime.
作为Haskell(GHC平台)的初学者,我遇到了处理与业务领域相关的数据类型和算术运算的问题,涉及货币/货币操作,我正在寻找解决方案.
我正在开发应该与(独立)会计模块(通过Web服务)接口的应用程序,同时具有用于临时数据输入的(web)用户界面,该用户界面存储在单独的数据库(PostgreSQL)中.
我来自C#/ F#环境,System.Decimal涵盖了那里的所有核心需求.如果我错了,请纠正我,但Haskell似乎没有可被视为等效的集成(默认)数据类型.
理想的选择是提供任意精度算术的数据类型,或者至少是Decimal128(IEEE 754)中的某些内容.该类型应该支持舍入(最接近,从零开始,如果可能还与偶数相关)和以下操作:加,减,乘,除(理想情况下也是平方/根).还应支持类型之间的转换.
从我设法发现,Hackage上有两个Haskell模块应该完全执行计算--Data.Fixed和Data.Decimal(顺便说一句,有什么方法可以在Haskell中创建自定义文字 - 例如复制123.45m来自F#?).至少后者会尽我所知(在快速测试之后)启用我在前一段中描述的大部分内容,但是当我添加一个DB(PostgreSQL通过Persistent/HDBC)和一个Web框架(YESOD)时混合的东西看起来不那么好看.似乎缺乏支持.
是否有任何其他组合能够以最小的摩擦力实现我所描述的端到端(数据输入=>数据处理=>存储)(例如,从DB加载后从字符串手动转换似乎很奇怪,具有非常强类型的语言)没有精度的损失(任何指针欢迎)?
我的程序使用runghc运行,但编译时出现错误"在查询期间丢失与MySQL服务器的连接"时,同一程序始终失败.失败与长时间运行的查询无关(它是小表上的CREATE VIEW).MySQL错误日志中没有任何内容,log_warnings = 1.环境 - ubuntu(13.04 ;-),本地数据库)
我有一个Haskell应用程序,作为许多步骤之一,需要在数据库中存储和检索原始二进制blob数据.我并不是完全决定将这些数据存储在普通磁盘文件中,但这确实会导致额外的一系列权限问题,因此我现在想要使用数据库.
我创建了一个包含类型列的表bytea.
我在内存中有一个Lazy Bytestring.
当我这样打电话的时候
run conn "INSERT INTO documents VALUES (?)" [toSql $ rawData mydoc]
Run Code Online (Sandbox Code Playgroud)
postgres对数据有点生气.确切的错误消息是
invalid byte sequence for encoding \"UTF8\": 0xcf72
Run Code Online (Sandbox Code Playgroud)
我也毫无疑问地知道我在数据流中有NUL值.因此,考虑到所有这些,安全地编码数据以进行插入的正确方法是什么?
更新
这是我的表的描述
db=> \d+ documents
Table "public.documents"
Column | Type | Modifiers | Storage | Description
-----------------+-----------------------------+-----------+----------+-------------
id | character varying(16) | not null | extended |
importtime | timestamp without time zone | not null | plain |
filename | character varying(255) | not null | extended |
data | bytea | …Run Code Online (Sandbox Code Playgroud) 我在Haskell中生成SQL查询并使用HDBC将它们提交到SQLite(3)数据库.现在,此函数返回一个查询:
import Database.HDBC.Sqlite3
import Database.HDBC
data UmeQuery = UmeQuery String [SqlValue] deriving Show
tRunUmeQuery :: UmeQuery -> FilePath -> IO [[SqlValue]]
tRunUmeQuery (UmeQuery q args) dbFile = do
conn <- connectSqlite3 dbFile
stat <- prepare conn q
s <- execute stat args
res <- fetchAllRows' stat
disconnect conn
return $ res
selectPos targetlt parentlt op pos = let
q= "select TARGET.* from levels tl, labeltypes tlt, segments TARGET,
(select TARGET.session_id session_id,SECONDARY.labeltype_id labeltype_id,
SECONDARY.label_id label_id,min(TARGET.label_id) min_childlabel_id from
levels tl, labeltypes tlt, …Run Code Online (Sandbox Code Playgroud) 现在我想连接db与haskell,我尝试使用cabal安装HDBC-ODBC,HSQL-ODBC和HDBC-mysql,我能够配置sqlite3,我怎么能添加这些包?当我尝试使用cabal安装它时,我收到此错误
Resolving dependencies...
Configuring HDBC-odbc-2.2.3.2...
Preprocessing library HDBC-odbc-2.2.3.2...
Connection.hsc:47:17: error: sql.h: No such file or directory
Connection.hsc:48:20: error: sqlext.h: No such file or directory
Connection.hsc: In function ‘main’:
Connection.hsc:95: error: ‘SQL_HANDLE_ENV’ undeclared (first use in this function)
...........................................
.........................................
Connection.hsc:245: error: expected expression before ‘int’
Connection.hsc:245: error: expected ‘)’ before numeric constant
Connection.hsc:245: error: expected ‘)’ before numeric constant
compiling dist/build/Database/HDBC/ODBC/Connection_hsc_make.c failed
command was: /usr/bin/gcc -c -D__GLASGOW_HASKELL__=612 -I. -I/usr/lib/ghc-6.12.1/time-1.1.4/include -I/usr/lib/ghc-6.12.1/old-time-1.0.0.3/include -I/usr/lib/ghc-6.12.1/bytestring-0.9.1.5/include -I/usr/lib/ghc-6.12.1/base-4.2.0.0/include -I/usr/lib/ghc-6.12.1/include -I/usr/lib/ghc-6.12.1/include -I/usr/lib/ghc-6.12.1/include/ dist/build/Database/HDBC/ODBC/Connection_hsc_make.c -o dist/build/Database/HDBC/ODBC/Connection_hsc_make.o
cabal: Error: …Run Code Online (Sandbox Code Playgroud) 我对Haskell的简洁和优雅感到震惊.但是我在一个.Net的房子里工作,所以当我能够逃脱它时,我会使用F# - 我可能是全国数百名使用它的人中唯一一个.
ADO.NET或F#是否提供与HDBC一样简洁优雅的东西executeMany?我正在通过真实世界Haskell.在第21章中,它提供了这个例子:
ghci> conn <- connectSqlite3 "test1.db"
ghci> stmt <- prepare conn "INSERT INTO test VALUES (?, ?)"
ghci> executeMany stmt [[toSql 5, toSql "five's nice"], [toSql 6, SqlNull]]
ghci> commit conn
ghci> disconnect conn
Run Code Online (Sandbox Code Playgroud)
我想在我的F#中获得这种优雅和简洁.我已经看到很多关于使用参数化查询以避免SQL注入攻击的炒作.在这种情况下,我没有使用它们有三个原因:
这是我的F#代码:
module Data
open System
open System.Data
open System.Data.OleDb
open System.Text.RegularExpressions
type Period = Prior | Current
let Import period records db =
use conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + db + ";Persist …Run Code Online (Sandbox Code Playgroud) 我正在使用HDBC从数据库中检索数据,然后尝试使用Happstack将此数据发送到Web客户端.
myFunc :: Integer -> IO String
myFunc = ... fetch from db here ...
handlers :: ServerPart Response
handlers =
do decodeBody (defaultBodyPolicy "/tmp/" 0 1000 1000)
msum [
dir "getData" $ ok $ toResponse $ myFunc $ toInteger 1
]
mainFunc = simpleHTTP nullConf handlers
Run Code Online (Sandbox Code Playgroud)
当我构建上面的代码时,我收到此错误:
使用"toResponse"时没有(ToMessage(IO String))的实例
我尝试了什么?
IO String为String(liftIO例如使用).提前致谢.