小编use*_*807的帖子

为什么Spring的jdbcTemplate.batchUpdate()这么慢?

我正在尝试找到更快的批量插入方法.

我试图用jdbcTemplate.update(String sql)插入几个批处理,其中sql是由StringBuilder 构建的,如下所示:

INSERT INTO TABLE(x, y, i) VALUES(1,2,3), (1,2,3), ... , (1,2,3)
Run Code Online (Sandbox Code Playgroud)

批量大小正好是1000.我插入了近100批.我使用StopWatch检查了时间并找出了插入时间:

min[38ms], avg[50ms], max[190ms] per batch
Run Code Online (Sandbox Code Playgroud)

我很高兴,但我想让我的代码变得更好.

之后,我尝试使用jdbcTemplate.batchUpdate,如:

    jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps, int i) throws SQLException {
                       // ...
        }
        @Override
        public int getBatchSize() {
            return 1000;
        }
    });
Run Code Online (Sandbox Code Playgroud)

sql的样子

INSERT INTO TABLE(x, y, i) VALUES(1,2,3);
Run Code Online (Sandbox Code Playgroud)

我很失望!jdbcTemplate以分开的方式执行1000行批处理的每个插入.我在mysql_log上找到了,发现有一千个插入.我使用StopWatch检查了时间并找出了插入时间:

min [900ms],avg [1100ms],每批最大[2000ms]

那么,任何人都可以向我解释一下,为什么jdbcTemplate在这个方法中做了单独的插入?为什么方法的名称是batchUpdate?或者可能是我以错误的方式使用这种方法?

java mysql spring jdbctemplate spring-batch

21
推荐指数
7
解决办法
6万
查看次数

为什么Java无符号位移位为负字节是如此奇怪?

我有一个字节变量:

byte varB = (byte) -1; // binary view: 1111 1111
Run Code Online (Sandbox Code Playgroud)

我想看到两个最左边的位并执行6位无符号右移:

varB = (byte) (varB >>> 6);
Run Code Online (Sandbox Code Playgroud)

但是我得到的-1好像是int类型,只有当我换30时才得到3!

我该如何解决这个问题,只能通过6位移位获得结果?

java bit-shift primitive-types

5
推荐指数
2
解决办法
493
查看次数

apache Http11NioProtocol 是如何工作的?

我正在尝试使用 Tomcat 7 Http11NioProtocol 从 NIO 中获得好处。

我刚刚读了一些关于它的文章: Understanding the Tomcat NIO Connector

并浏览:tomcat docs

我仅使用 SimpleServlet 启动了简单服务器,它计算并发线程数,等待 10 秒并返回空结果:

public class SimpleServlet extends HttpServlet {

final static Logger logger = Logger.getLogger(SimpleServlet.class);
private static final AtomicInteger threadCntr = new AtomicInteger();

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
}

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
    logger.info("ProxyService doGet threads[" + threadCntr.incrementAndGet() + "]");
    try {
        Thread.sleep(10000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } …
Run Code Online (Sandbox Code Playgroud)

nio tomcat7

5
推荐指数
0
解决办法
3223
查看次数

紧凑的 java.util.Map 实现

是否有任何 java.util.Map 实现不存储等于 ValueObjects 的值但只存储其中一个?(这个对象的引用不同,但它们是相等的)

这是一个小测试代码:

Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 
for (int i = 0; i <= 1000000; i++) { 
map.put(i, new Integer(42)); 
}
Run Code Online (Sandbox Code Playgroud)

和可视化 VM 显示:200 万个 Integer 实例这些对象是相等的,但 Map 存储了所有这些对象

在此处输入图片说明

仅用于历史记录,我编写了 chiastic-security 的解决方案并对其进行测试以与 HashMap 进行比较:

public class CompactMap<K, V> implements Map<K, V> {

private Map<K, V> map;
private Map<V, V> canonicalMap;

public CompactMap() {
    map = new HashMap<K, V>();
    canonicalMap = new HashMap<V, V>();
}

@Override
public void clear() {
    map.clear();
    canonicalMap.clear();
}

@Override
public …
Run Code Online (Sandbox Code Playgroud)

java dictionary

2
推荐指数
1
解决办法
821
查看次数

如何regExp'零或一个'组包含'.*'

我试图让record1,record2,record3从文字:

"Record1 ANY TEXT 123 4 5 Record2 ANOTHER TEXT 90-8098 Record3 MORE TEXT ASD 123"
Run Code Online (Sandbox Code Playgroud)

每条记录显示一次或零次.我使用模式:

(Record1.*)?(Record2.*)?(Record3.*)?
Run Code Online (Sandbox Code Playgroud)

如果出现每条记录,

matcher.group(1) == "Record1 ANY TEXT 123 4 5 Record2 ANOTHER TEXT 90-8098 Record3 MORE TEXT ASD 123"
matcher.group(2) == null
matcher.group(3) == null
Run Code Online (Sandbox Code Playgroud)

如果我使用模式:

(Record1.*)(Record2.*)(Record3.*)

matcher.group(1) == "Record1 ANY TEXT 123 4 5 "
matcher.group(2) == "Record2 ANOTHER TEXT 90-8098 "
matcher.group(3) == "Record3 MORE TEXT ASD 123"
Run Code Online (Sandbox Code Playgroud)

这是我想要的,但是每个记录都可以显示为零时间,并且此正则表达式不合适

我应该使用什么样的模式?

java regex

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