小编Kev*_*Jin的帖子

每个连接模型的Java线程与NIO

非阻塞Java NIO是否仍然比每个连接异步套接字的标准线程慢?

另外,如果你每个连接使用线程,你会创建新线程还是使用非常大的线程池?

我正在用Java编写一个MMORPG服务器,它应该能够在足够强大的硬件下轻松扩展10000个客户端,尽管最大客户端数量是24000(我相信由于15000线程,每个连接模型的线程无法达到Java中的限制).从一篇三年前的文章中,我听说用每个连接模式的线程阻塞IO仍然比NIO快25%(即本文档http://www.mailinator.com/tymaPaulMultithreaded.pdf),但是可以在这一天还能实现吗?从那以后Java发生了很大变化,我听说在比较现实生活场景时结果是有问题的,因为使用的VM不是Sun Java.另外,因为它是一个MMORPG服务器,许多并发用户互相交互,所以使用同步和线程安全实践会降低性能,以至于为10000个客户端提供服务的单线程NIO选择器会更快吗?(所有工作都不必在带有选择器的线程上处理,它可以在工作线程上处理,就像MINA/Netty的工作方式一样).

谢谢!

java multithreading asynchronous nio nonblocking

37
推荐指数
3
解决办法
2万
查看次数

MySQL列具有默认的null - 样式选择,或者是它?

在许多SQL版本中,有三种方法可以在每次插入行时将列隐式设置为NULL.这些是

columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL
Run Code Online (Sandbox Code Playgroud)

即第一个设置NULL标志(与NOT NULL相反),第二个将NULL标志保留为默认值,第三个设置NULL标志并将隐式值设置为NULL.

我听说过在Microsoft SQL中,第二种变体并不完全相同,因为您还可以自定义表或模式的NULL标志的默认值.

但对于MySQL,我不相信有这样的功能.此外,在MySQL中,具有NULL标志的列(与NOT NULL列不同),如果没有显式值,则在插入时始终隐式设置为NULL,即使打开严格模式也是如此.这样就使所有这些列声明都相同.

在我的MySQL脚本中,对于每个NOT NULL列,我为我的应用程序中的某些插入中不希望设置的列指定DEFAULT值,以避免在启用严格模式时出现任何问题.因此,如果我选择第三种变体,我觉得它会更加对称,即使它是最冗长和明确的.是第三种变体的声明是常见的,还是第一种或第二种变异在其他人的脚本中更频繁地出现?

我正在考虑倾向于第二种方法,因为这是MySQL转储使用的别名,但我不确定这是一个好主意,因为它还在列声明的默认子句中将整数文字转储为字符串(单引号).

这个问题似乎比有解决方案的问题更有意见,但我也想知道任何我不知道的潜在问题.我可能会选择将来从MySQL迁移到PostgreSQL,我也可以使用这些专家的一些建议,例如,如果PostgreSQL区分这些情况,如MS-SQL.如果我做了任何不正确的假设,如果我错了,请纠正我.

mysql sql postgresql database-migration sql-scripts

20
推荐指数
2
解决办法
3万
查看次数

使用一个连接 - 样式选择执行两个Java PreparedStatements

好吧,我已经意识到我确实在没有回馈社区的情况下问过太多问题,但我希望你对此有所了解.如果我有话

private void closeAll(ResultSet rs, PreparedStatement ps, Connection con) {
    if (rs != null)
        try {
            rs.close();
        } catch (SQLException e) {
        }
    if (ps != null)
        try {
            ps.close();
        } catch (SQLException e) {
        }
    if (con != null)
        try {
            con.close();
        } catch (SQLException e) {
        }
}
Run Code Online (Sandbox Code Playgroud)

我想使用单个连接在我的MySQL数据库上进行多项操作.写作更好吗?

Connection con = ...;
PreparedStatement ps = null;
ResultSet rs = null;
try {
    ps = con.prepareStatement(...);
    rs = ps.executeQuery();
    if (rs.next()) ...;
} catch (SQLException e) {
    System.err.println("Error: …
Run Code Online (Sandbox Code Playgroud)

java resources jdbc

8
推荐指数
1
解决办法
1万
查看次数

MySQL Connector / NET连接每个连接是否有多个DataReader?

大家好,我已经从Java迁移到C#,因为我意识到我更喜欢C#语言功能,而不是Java中的功能,但是这个问题很小。在MySQL Connector / J和JDBC中,我相信我的一个应用程序允许PreparedStatement在打开另一个时执行多个s,就像我可以执行一个返回a的查询,ResultSetResultSet在仍然打开时,我可以打开另一个PreparedStatement并获取另一个ResultSet或者我可以根据我第一次获得的数据执行更新ResultSet(即,插入盐值,并在我意识到该行在密码列中包含明文密码的情况下,使用SHA512哈希更新密码列)。

但是,使用连接器/ NET,每当我尝试执行此操作时,我都会发现以下错误: MySql.Data.MySqlClient.MySqlException: There is already an open DataReader associated with this Connection which must be closed first.

有没有简单的方法可以解决此错误,也许是MySQL到.NET桥的其他任何实现?我实际上不想在一个应用程序中创建很多数据库连接,尽管我可能想为我的应用程序中的每个线程创建一个数据库连接(例如在ThreadLocal中)。当我以两种不同的方法同时执行两个查询时,ThreadLocal DB连接会有所帮助,但是很显然,我无法将这两个命令分成不同的线程,并且我不想创建多余的线程。

顺便说一下,这是代码本身。是的,关闭阅读器后,我可以将更新代码向下移动,但是我有更多类似的方法,其中一些方法比此方法更难解决:

MySqlConnection con = DatabaseConnection.GetConnection();
MySqlCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT `id`,`password`,`salt`,`pin`,`gender`,`birthday` FROM `accounts` WHERE `name` = '" + AccountName + "'";
MySqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
    AccountId = reader.GetInt32(0);
    string passhash = !reader.IsDBNull(1) ? reader.GetString(1) : null;
    string salt = …
Run Code Online (Sandbox Code Playgroud)

.net mysql database-connection sqldatareader mysql-connector

5
推荐指数
1
解决办法
8561
查看次数

Java Runtime.exec在Linux上遇到了麻烦

大家好.我正在开发一个Java程序,用于在Linux环境中使用,该环境创建一个运行另一个Java类的新Java进程,但我遇到了麻烦.我终于解决了所有问题.调用

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" })
Run Code Online (Sandbox Code Playgroud)

在我的Java程序中返回

/bin/bash: /usr/lib/jvm/java-6-openjdk/jre/bin/java -classpath /home/kevin/workspace/Misc/bin HelloWorld: No such file or directory
Run Code Online (Sandbox Code Playgroud)

在stdout/stderr中.如果我试试

Runtime.getRuntime().exec(new String[] { "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" })
Run Code Online (Sandbox Code Playgroud)

我得到一个Java异常

Cannot run program "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'": java.io.IOException: error=2, No such file or directory
     ...
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory
Run Code Online (Sandbox Code Playgroud)

最后,使用简单

Runtime.getRuntime().exec("/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'")
Run Code Online (Sandbox Code Playgroud)

给了我一个

-classpath: -c: line 0: unexpected EOF while looking for matching `'' …
Run Code Online (Sandbox Code Playgroud)

java linux bash runtime exec

5
推荐指数
1
解决办法
1万
查看次数

无法在Scala中扩展Future [T]特征

请原谅我对Scala的不了解.我只是一个想要在Play Framework中工作的Java开发人员.我甚至尝试使用Java代码实现一个特性,但是我得到了更加模糊的错误.我有以下Scala代码:

package models

import scala.concurrent.Future

class SettableFuture[T](name: String) extends Future[T] {
    var assignedValue: T

    def set(newValue: T) =
        assignedValue = newValue

    //override abstract methods in Future[T]
    def ready(atMost: scala.concurrent.duration.Duration)(implicit permit: scala.concurrent.CanAwait): models.SettableFuture[T] =
        this

    def result(atMost: scala.concurrent.duration.Duration)(implicit permit: scala.concurrent.CanAwait): T =
        assignedValue

    def isCompleted: Boolean =
        false

    def onComplete[U](func: scala.util.Try[T] => U)(implicit executor: scala.concurrent.ExecutionContext): Unit =
        null

    def value: Option[scala.util.Try[T]] =
        null
}
Run Code Online (Sandbox Code Playgroud)

这是我的错误:

overriding method ready in trait Awaitable of type (atMost: scala.concurrent.duration.Duration)(implicit permit: scala.concurrent.CanAwait)SettableFuture.this.type; method ready has …
Run Code Online (Sandbox Code Playgroud)

scala playframework-2.0

0
推荐指数
1
解决办法
1480
查看次数