小编Jam*_*s B的帖子

为什么System.arraycopy在Java中是原生的?

我很惊讶在Java源代码中看到System.arraycopy是一个本机方法.

当然原因是因为它更快.但是什么原生技巧是能够使用的代码使其更快?

为什么不循环遍历原始数组并将每个指针复制到新数组 - 当然这不是那么缓慢和麻烦?

java arrays native arraycopy

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

存储过程通过Java运行速度比直接在数据库上运行慢30%

我正在使用Java 1.6,JTDS 1.2.2(也只是尝试1.2.4无效)和SQL Server 2005来创建CallableStatement来运行存储过程(没有参数).我看到运行相同存储过程的Java包装器比使用SQL Server Management Studio慢30%.我运行MS SQL分析器,两个进程之间的I/O差别不大,所以我认为它与查询计划缓存无关.

存储的proc不带参数,也不返回任何数据.它使用服务器端游标来计算填充表所需的值.

我无法看到从Java调用存储过程如何增加30%的开销,当然它只是数据库的一个管道,SQL被发送下来然后数据库执行它....数据库是否可以提供Java应用不同的查询计划?

我已经发布了MSDN论坛和sourceforge JTDS论坛(主题:"在JTDS中存储过程比在DB中更直接")我想知道是否有人有任何关于为什么会发生这种情况的建议?

提前致谢,

-詹姆士

(NB不要害怕,一旦找到解决方案,我会在这里整理其他论坛中的任何答案)

Java代码片段:

sLogger.info("Preparing call...");
stmt = mCon.prepareCall("SP_WB200_POPULATE_TABLE_limited_rows");
sLogger.info("Call prepared.  Executing procedure...");
stmt.executeQuery();
sLogger.info("Procedure complete.");
Run Code Online (Sandbox Code Playgroud)

我运行了sql profiler,发现了以下内容:

Java app:CPU:466,514阅读次数:142,478,387撰写:284,078期限:983,796

SSMS:CPU:466,973阅读次数:142,440,401写作:280,244持续时间:769,851

(两个DBCC DROPCLEANBUFFERS在分析之前运行,并且都产生正确的行数)

所以我的结论是他们都执行相同的读写操作,只是他们这样做的方式不同,你们怎么想?

事实证明,查询计划对于不同的客户端是显着不同的(Java客户端在插入期间更新索引不在更快的SQL客户端中,同样,它执行连接的方式也不同(嵌套循环Vs.收集流,嵌套循环Vs索引扫描,唉!)).这就是为什么,我还不知道(当我到底时,我会重新发帖)

结语

我无法让它正常工作.我试图均质连接属性(arithabort,ansi_nulls在Java和管理工作室客户端之间等).它最终导致两个不同的客户端具有非常相似的查询/执行计划(但仍然具有不同的实际plan_ids).我发布了我在MSDN SQL Server论坛上发现的摘要,因为我发现不仅在JDBC客户端和管理工作室之间,而且在Microsoft自己的命令行客户端SQLCMD之间有不同的性能,我还检查了一些更激进的事情,如网络流量也可以将存储的proc包装在另一个存储过程中,只是为了咧嘴笑.

我有一种感觉问题出在游标执行方式的某个地方,并且它以某种方式导致Java进程被暂停,但是为什么不同的客户端应该在没有其他运行时产生这种不同的锁定/等待行为并且运行相同的执行计划有点超出我的技能(我不是DBA!).

结果,我已经决定用4天的时间浪费在这样的事情上,所以我会勉强编写代码(如果我诚实的话,存储过程需要重新编码才能更多增量而不是重新编写代码. - 无论如何,每周计算所有数据),然后用白垩来体验.我会把这个问题保持开放,非常感谢所有把帽子戴在戒指上的人,这一切都很有用,如果有人想出更进一步的话,我很想听到更多的选择......如果有人发现的话这篇文章是因为在他们自己的环境中看到这种行为,所以希望这里有一些你可以自己尝试的指针,希望能比我们更充分地看到.

我现在已经准备好了周末!

-詹姆士

java sql sql-server stored-procedures jtds

10
推荐指数
1
解决办法
3215
查看次数

树/树状图与d3中的弯头连接器

我对d3.js(以及一般的SVG)很新,我想做一些简单的事情:带有角度连接器的树/树形图.

我从这里蚕食了d3的例子:http ://mbostock.github.com/d3/ex/cluster.html我想让它更像这里的protovis示例:

我在这里开始:http://jsbin.com/ugacud/2/edit#javascript,html,我认为这是以下代码片段的错误:

var diagonal = d3.svg.diagonal()
.projection(function(d) { return [d.y, d.x]; });
Run Code Online (Sandbox Code Playgroud)

然而,没有明显的替代品,我可以使用d3.svg.line,但我不知道如何正确地集成它,理想情况下我想要一个弯头连接器....虽然我想知道我是否使用了错误的库,因为我见过的很多d3例子都是用引力来制作物体图而不是树.

javascript svg dendrogram d3.js

9
推荐指数
1
解决办法
7614
查看次数

是否可以在sql server上使用jdbc获取查询计划?

我正在使用JTDS驱动程序,我想确保我的java客户端收到与在Mgmt studio中执行SQL时相同的查询计划,有没有办法获得查询计划(理想情况下是xml格式)?

基本上,我想要相同的格式输出

set showplan_xml on 
Run Code Online (Sandbox Code Playgroud)

在管理工作室.有任何想法吗?

一些用于获取session_id计划的代码

SELECT usecounts, cacheobjtype,
  objtype, [text], query_plan
FROM sys.dm_exec_requests req, sys.dm_exec_cached_plans P
  CROSS APPLY
    sys.dm_exec_sql_text(plan_handle)
  CROSS APPLY
    sys.dm_exec_query_plan(plan_handle)    
WHERE cacheobjtype = 'Compiled Plan'
    AND [text] NOT LIKE '%sys.dm_%'
    --and text like '%sp%reassign%'
    and p.plan_handle = req.plan_handle
    and req.session_id = 70 /** <-- your sesssion_id here **/
Run Code Online (Sandbox Code Playgroud)

java sql-server sql-server-2005 jtds jdbc

4
推荐指数
1
解决办法
1923
查看次数

为什么需要同步?

我试图在我的Java线程知识​​中填补一些可耻的空白,而我正在阅读Brian Goetz等人(强烈推荐的BTW)中的Java Concurrency in Practice,本书中的一个早期例子给我留下了一个问题.在下面的代码中,我完全理解为什么在更新hitscacheHits成员变量时需要同步,但为什么getHits在读取hits变量时需要该方法呢?

第2章的示例代码:

public class CachedFactorizer extends GenericServlet implements Servlet {
  private BigInteger lastNumber;
  private BigInteger[] lastFactors;
  private long hits;
  private long cacheHits;

public synchronized long getHits() {
    return hits;
}

public synchronized double getCacheHitRatio() {
    return (double) cacheHits / (double) hits;
}

public void service(ServletRequest req, ServletResponse resp) {
    BigInteger i = extractFromRequest(req);
    BigInteger[] factors = null;
    synchronized (this) {
        ++hits;
        if (i.equals(lastNumber)) {
            ++cacheHits;
            factors = lastFactors.clone(); …
Run Code Online (Sandbox Code Playgroud)

java multithreading thread-safety

3
推荐指数
1
解决办法
846
查看次数

为什么我的多线程Java程序没有超出我机器上的所有内核?

我有一个程序启动并创建一个内存数据模型,然后创建一个(命令行指定的)线程数,以针对输入集和该数据模型运行多个字符串检查算法.工作分为沿输入字符串集的线程,然后每个线程迭代相同的内存数据模型实例(永远不会再次更新,因此没有同步问题).

我在带有2个四核处理器的Windows 2003 64位服务器上运行它,并且通过查看Windows任务管理器,当我运行时,它们没有被最大限度地使用,(它们看起来也不像是特别征税) 10个主题.这是正常的行为吗?

似乎7个线程在相似的时间内完成了相似的工作量,所以你建议用7个线程运行吗?

我应该用更多的线程运行吗?...虽然我认为这可能是有害的,因为JVM将在线程之间进行更多的上下文切换.

或者,我应该用更少的线程运行它吗?

或者,什么是我可以用来衡量这个的最佳工具?...一个分析工具会帮助我 - 实际上,这是几个能够更好地检测瓶颈(假设我有一个)的分析师之一吗?

请注意,服务器也运行SQL Server 2005(这可能相关也可能不相关),但是当我运行程序时,该数据库上没有发生任何事情.

另请注意,线程仅执行字符串匹配,它们不执行任何I/O或数据库工作或其他任何可能需要等待的操作.

java concurrency multithreading multicore

3
推荐指数
1
解决办法
1919
查看次数

多核/多处理器系统上Thread.currentThread()的语义?

如果在多核或多处理器机器上运行,其中jvm可能绝对同时运行多个线程(不仅仅是同时出现),api方法java.lang.Thread.currentThread()返回什么?....在上面的场景中,它是否只返回随机的一个当前线程?

java multithreading multicore

3
推荐指数
1
解决办法
902
查看次数