java多线程里能使用mybatis或者jpa插入吗?
//下面是按照老大Richard_Yi的法子做出来的,截图如下
/////////////下面是旧的
//最新更新,截图如上,项目结构能够看见,说下,我那个brandRepository在别的包可以插入的,比如controller里的方法,就是在这个包下不行,不是一直都插入不进去的
public class ThirdThread implements Runnable {
private Brand brand;private BrandRepository brandRepos;
@Autowired
BrandRepository brandRepository;
Logger logger = LoggerFactory.getLogger(getClass());
public ThirdThread() {
this.brandRepos=brandRepository;
this.brand = new Brand(); }
@Override
public void run() {
logger.info("third开始时间"+System.currentTimeMillis());
for (int i = 1; i < 11; i++) {
brand.setId(i);
brand.setName("wygyf");
brand.setFirstname("gheu");
brand.setCid(1);
brandRepos.save(brand);
}
//上面是线程类的代码,然后到调用的地方
Thread thread = new Thread(new ThirdThread());
thread.start();
代码如上,现在的问题是,每次还是报空指针,就是save那,我问人说是因为异步线程,来不及注入所以一直为空,我在构造函数里将bean注入了,但jpa那怎么操作我不知道。
求高人解惑,谢谢
回答:
题主的目的:一个线程插入大批量的数据,和多个线程同时插入大批量的数据,在时间上是否有差距,所以在线程里用正常的orm方式操作数据库;
他想用Spring-Data-Jpa这种方式去插入数据,简化操作。
看着像SpringBoot应用。举个例子
@AllArgsConstructorpublic class Task implements Callable<String> {
private String name;
private BrandRepository brandRepository;
@Override
public String call() throws Exception {
long temp = System.currentTimeMillis();
for (int i = 1; i < 10; i++) {
brandRepository.save(new Brand(name, i));
}
return name + "执行耗时" + (System.currentTimeMillis() - temp);
}
}
BrandRepository
@Data@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Brand {
private String name;
private int seq;
}
/**
* @author Richard_yyf
* @version 1.0 2019/10/11
*/
// 把这个 Component 类比 Repository
@Component
public class BrandRepository {
public void save(Brand brand) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("执行插入数据库操作 " + brand.toString());
}
}
main方法
@SpringBootApplication@Slf4j
public class Demo999Application {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(Demo999Application.class, args);
//System.in.read(); // press any key to exit
ExecutorService executor = Executors.newCachedThreadPool();
try {
List<Callable<String>> list = new ArrayList<>();
list.add(new Task("线程1", context.getBean(BrandRepository.class)));
list.add(new Task("线程2", context.getBean(BrandRepository.class)));
List<Future<String>> futures = executor.invokeAll(list);
for (Future<String> future : futures) {
System.out.println("任务执行完成:" + future.get());
}
} catch (InterruptedException | ExecutionException e) {
log.error("", e);
}
try {
executor.shutdown();
if(!executor.awaitTermination(10000, TimeUnit.MILLISECONDS)){
// 超时的时候向线程池中所有的线程发出中断(interrupted)。
executor.shutdownNow();
}
} catch (InterruptedException e) {
// awaitTermination方法被中断的时候也中止线程池中全部的线程的执行。
System.out.println("awaitTermination interrupted: " + e);
executor.shutdownNow();
}
}
}
如果是Spring的话同理,用个java configuration类配置或者扫描相关的Bean,然后main方法里用new ***ApplicationContext()
启动容器,如上操作即可。
回答:
- 能
- 空指针说明没有注入,是根本没有注入,不是没来得及注入
回答:
都可以用MyBatis或者jpa写入数据库。看到你的代码,我猜测是两个原因,一是根本没有这个接口,而是@AutoWired的问题。
首先着重讲一下@AutoWired的问题,@AutoWired我觉得它的使用场景比较少,多用于只有一个实现类的接口,我曾经也遇到@AutoWired空指针的问题,我自己是改用@Resource的注解。
另外你通过注入,然后再通过构造器赋值,这一步我没看懂原因,直接@Resource或者用@AutoWired以及@Qualifier组合注入就可以了。
以上是 java多线程里能使用mybatis或者jpa插入吗? 的全部内容, 来源链接: utcz.com/p/174005.html