我想尽可能地防止数据库连接被打开,因为这个代码将在密集使用的服务器上运行,这里的人已经告诉我应该尽快关闭数据库连接.
def do_something_that_needs_database ():
dbConnection = MySQLdb.connect(host=args['database_host'], user=args['database_user'], passwd=args['database_pass'], db=args['database_tabl'], cursorclass=MySQLdb.cursors.DictCursor)
dbCursor = dbConnection.cursor()
dbCursor.execute('SELECT COUNT(*) total FROM table')
row = dbCursor.fetchone()
if row['total'] == 0:
print 'error: table have no records'
dbCursor.execute('UPDATE table SET field="%s"', whatever_value)
return None
print 'table is ok'
dbCursor.execute('UPDATE table SET field="%s"', another_value)
# a lot more of workflow done here
dbConnection.close()
# even more stuff would come below
Run Code Online (Sandbox Code Playgroud)
我相信当桌子上没有行时会打开数据库连接,所以我仍然不确定它是如何工作的.
无论如何,也许这是糟糕的设计,因为我可以在每个小块之后打开和关闭数据库连接execute.当然,我可以在这种情况下添加一个close权利return......
但是,我怎么能总是正确关闭数据库,而不必担心,如果我有return,或raise,或continue …
我正在使用C#,我正在尝试连接到00webhost托管的MySQL数据库.
我收到了错误connection.Open():
这个参数没有mysql主机.
我检查过,一切似乎都很好.
string MyConString = "SERVER=mysql7.000webhost.com;" +
"DATABASE=a455555_test;" +
"UID=a455555_me;" +
"PASSWORD=something;";
MySqlConnection connection = new MySqlConnection(MyConString);
MySqlCommand command = connection.CreateCommand();
MySqlDataReader Reader;
command.CommandText = "INSERT Test SET lat=" +
OSGconv.deciLat + ",long=" + OSGconv.deciLon;
connection.Open();
Reader = command.ExecuteReader();
connection.Close();
Run Code Online (Sandbox Code Playgroud)
这个连接字符串有什么问题?
我有一个由大约15种方法组成的Java程序.并且,在程序的执行期间非常频繁地调用这些方法.目前,我正在每个方法中创建一个新连接并在其上调用语句(数据库在网络上的另一台机器上设置).
我想知道的是:我应该在main方法中只创建一个连接,并将其作为参数传递给需要连接对象的所有方法,因为它会显着减少程序中连接对象的数量,而不是创建并且在每种方法中经常关闭连接.
我怀疑我没有使用当前设计非常有效地使用资源,并且考虑到该程序将来可能会增长很多,因此还有很大的改进空间.
我的DBA说有太多的连接打开,他认为这是我的.net中的代码让他们开放.
我首先使用LINQ查询和EF代码.
示例方法:
public List<Stuff> GetStuff()
{
var db = new DBContext();
var results = db.stuff.toList();
return results;
}
Run Code Online (Sandbox Code Playgroud)
一旦完成,我是否需要处理db var?我的理解是我不需要在EF和LINQ中.请指向我关于管理LINQ/EF和数据库连接的代码连接或最佳实践的Microsoft文档
更新:
我补充道
db.Connection.Close();
db.Dispose();
Run Code Online (Sandbox Code Playgroud)
执行两行后,我仍然在SQL中看到打开的连接.当我迫使它关闭时,有没有理由不关闭它?
这没有延迟:
$connection = new MongoClient("mongodb://localhost:27017", array("replicaSet" => REPLICASET,'username'=>USER, 'password'=>PASSWORD, 'db'=>DATABASE));
Run Code Online (Sandbox Code Playgroud)
但是,当我从副本集添加所有主机时,这最多需要10秒.PHP驱动程序(1.6.7)
$connection = new MongoClient("mongodb://".HOST_1.":27017,".HOST_2.":27017,".HOST_3.":27018", array("replicaSet" => REPLICASET,'username'=>USER, 'password'=>PASSWORD, 'db'=>DATABASE));
Run Code Online (Sandbox Code Playgroud)
在日志中,延迟似乎在每个连接处.以下是日志的摘录:
[22-Jun-2015 12:04:41 Australia/ACT] PHP Notice: CON FINE: Connecting to tcp://ec2-XX-XXX-XXX-XXX.ap-southeast-2.compute.amazonaws.com:27017 (ec2-XX-XXX-XXX-XXX.ap-southeast-2.compute.amazonaws.com:27017;launch;launch/launch/55a850dad20e018890350ece678dc293;15873) with connection timeout: 60.000000 in /home/user/public_html/test.php on line 52
[22-Jun-2015 12:04:47 Australia/ACT] PHP Notice: CON INFO: stream_connect: Not establishing SSL for ec2-XX-XXX-XXX-XXX.ap-southeast-2.compute.amazonaws.com:27017 in /home/user/public_html/test.php on line 52
Run Code Online (Sandbox Code Playgroud)
当我进入主服务器并尝试从终端快速连接时.
mongo --host "launch/host:27017,ec2-XX-XXX-XXX-XXX.ap-southeast-2.compute.amazonaws.com:27017,host2:27018" --authenticationDatabase launch -u USERNAME -p PASSWORD
Run Code Online (Sandbox Code Playgroud)
为什么PHP需要这么长时间才能连接?
7月20日更新:
我已将主服务器上的mongo更新为2.6.10但我的测试页面仍需要5秒才能加载.这就是我试图连接的方式:
error_reporting(E_ALL);
MongoLog::setLevel(MongoLog::ALL);
MongoLog::setModule(MongoLog::ALL);
try {
$connection = new …Run Code Online (Sandbox Code Playgroud) 我正在开发基于开源java的应用程序,即xwiki.insie hibernate.cfg.xml我可以看到参数connection.pool_size和statement_cache.siz的值为2(对于每个).我的应用程序将在最多时间内拥有100个用户.现在我的问题是什么应该是理想的连接池大小.对我来说,2号看起来很少.如果一次连接100个用户98用户必须等待grtting连接被释放?在我的情况下,我应该将连接池大小保持为100吗?
我正在使用microsoft sql server.
除此之外,最大连接池大小也有限制.它依赖于webserver(在我的情况下是tomcat)还是数据存储供应商(ms sql server)?
java sql-server database-connection connection-pooling flexy-pool
在仪表板中,我看到数据库实例当前有22个打开的连接,阻止了与错误的新连接:
剩余的连接槽保留用于非复制超级用户连接.
我正在从EC2实例上运行的Web服务API访问数据库,并始终保持最佳实践:
Connection connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
Class.forName(DB_CLASS);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(SQL_Query_String);
...
resultSet.close();
statement.close();
connection.close();
Run Code Online (Sandbox Code Playgroud)
我可以在代码中做些其他事情吗?
我应该在数据库管理中做些什么吗?
有没有办法定期关闭连接?
sql postgresql database-connection amazon-web-services amazon-rds
Java Connection.close是否会回滚到finally块?
我知道.Net SqlConnection.close做到了.
有了这个,我可以在没有捕获的情况下制作try/finally块...
例:
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.close();
}
Run Code Online (Sandbox Code Playgroud) 所以我使用SQL身份验证在web.config中使用连接字符串.
当然人们说这可能是一个漏洞,因为你用明文存储密码.
但是,据我所知,IIS从不提供web.config,而web.config应该只对管理员和IIS具有读访问权限.因此,如果黑客已获得对Web服务器的访问权限,那么我使用的加密方式无关紧要,因为私钥将位于Web服务器上.
不会通过混淆将加密连接字符串归类为安全性吗?
是否值得加密web.config连接字符串并将私钥存储在Web服务器上?
此外,当然如果我不使用SSL,我将通过HTTP以明文传输连接字符串.如果我使用SSL,那么这个问题也应该减轻.
.net asp.net connection-string database-connection web-config
在数据库停机后,Rails将首先抛出此错误一次:
ActiveRecord :: StatementInvalid:NativeException:org.postgresql.util.PSQLException:连接被拒绝.检查主机名和端口是否正确以及postmaster是否接受TCP/IP连接.
从那时起,即使在数据库备份之后,每次调用数据库都会出现以下错误:
ActiveRecord :: StatementInvalid:ActiveRecord :: JDBCError:此连接已关闭.
为了让服务器再次运行,我必须重新启动rails服务器.这对我们来说并不理想,因为我们的产品工程师希望对我们的数据库进行维护,而不必恢复依赖于数据库的所有服务.所以,我想知道 - 有没有办法自动让Rails尝试重新建立数据库连接或建议的方式来获得这种行为?
我尝试过的事情:
我已经尝试在我的数据库选项中将reconnect设置为true,然后我可以杀死单个数据库连接,rails将重新建立连接.但是,它不会在数据库中断之后.我发现从命令控制台我可以通过调用来恢复连接
的ActiveRecord :: Base的:: establish_connection
所以也许找到一个干净的地方让rails调用上面的命令,这会有用吗?有什么建议?
java ×3
c# ×2
sql ×2
.net ×1
amazon-rds ×1
asp.net ×1
flexy-pool ×1
idisposable ×1
jdbc ×1
mongodb ×1
mysql ×1
nested ×1
performance ×1
postgresql ×1
python ×1
sql-server ×1
transactions ×1
web-config ×1