• 关于 java绑定异常 的搜索结果

回答

不用框架的话。自己写一个工具类使用一个ThreadLocal变量,绑定Connection。工具类中提供获取数据库connection的方法,并且绑定当前线程,并将autoCommit()设为false。;工具类中还要提供一个方法来提交当前线程的connection,并处理异常回滚的方法。commit()然后用java的动态代理,给service方法上加个前置通知,通过工具类的getMyConnection()来获取connection;service方法上再加一个后置通知调用工具类的commit()方法。dao层也要通过工具类去获取当前线程的同一个Connection。大概思路就是这样,具体细节需要自己考虑。这也是spring管理事务的基本做法。

爱吃鱼的程序员 2020-06-14 15:58:20 0 浏览量 回答数 0

问题

当具体的JPA实体类与其通用超类位于不同的包中时,问题加载应用程序

几许相思几点泪 2019-12-22 18:29:45 21 浏览量 回答数 1

回答

我是使用springmvc自动封装成对象,自己写了number和date的转化器,转化异常就设置为null,json数据雷同你好啊我最近也使用了springmvc刚好有个问题一直找不到答案就是在数据库操作时好像没有rollback操作啊自己置顶多些前辈来分享经验啊springaop事务,遇到异常是自动回滚的。 使用springmvc+hibernatevalidator可以达到你想要的数据绑定及自动校验的目的,具体怎么使用可以去网上搜资料看。  json转成对象为啥就不能验证了?直接转成对象了然后变量中int的如果对应进了string的话就报错了<spanstyle="line-height:1.428571em;font-weight:bold;font-size:12pt;font-family:Arial;">Struts2Validator<spanstyle="line-height:1.428571em;font-size:10pt;font-family:Arial;"> json转化java对象也可以自己写转化实现的!

爱吃鱼的程序员 2020-06-22 18:15:30 0 浏览量 回答数 0

高校特惠专场

助力学生创业梦,0元体验,快速入门云计算!

回答

以下为压测和调试日志中,常见的 Error 信息: class java.net.SocketTimeoutException:null 表示请求在等待响应或者读取中途(idle)超时。请检查服务端健康状况或者 PTS 的压测 API 超时时间的设置是否合理,另外还有可能是服务端处理能力出现瓶颈。 class java.net.ConnectException:null 表示请求在与远端(被压测端)建立 TCP 连接时就出现失败或者被远端拒绝。请检查服务端健康状况,或者是网络连接层是否有瓶颈。 class java.util.concurrent.TimeoutException:null 表示请求在与远端(被压测端)建立 TCP 连接时就出现失败或者被远端拒绝。请检查服务端健康状况,或者是网络连接层是否有瓶颈。 class org.apache.http.ConnectionClosedException:Connection closed 表示连接异常关闭,服务端主动关闭了连接。 class java.io.IOException:Connection reset by peer 表示连接被重置。若使用了 SLB,请查看 SLB 的配置是否有问题。 class org.apache.http.ConnectionClosedException:Connection closed unexpectedly 表示数据尚未接收完毕,连接就已关闭。可能服务端未及时响应或者提前终止调试或压测。 class java.lang.RuntimeException:java.net.UnknownHostException 表示域名信息无法解析。请检查域名是否已经正常注册并可以解析、未注册的域名是否已进行域名绑定。 建议结合 Timing 瀑布模型查看,各种报错都可以体现在 Timing 瀑布模型中,例如: 建立连接环节超时 等待响应或者读取响应的间隔时间超时 Waiting(TTFB)表示等待第一个响应字节的时间。这个时间包括一次完整的往返和延迟,同时包括了服务器应对响应所用的时间。 class org.apache.http.client.CircularRedirectException 表示请求出现了循环重定向的情况(A -> B -> C -> A),或者跳转超过了10次(A1 -> A2 -> A3... -> A10 ->A11)。建议取消302跳转配置后压测查看原始请求信息,并可结合Timin瀑布流查看跳转具体路径。

保持可爱mmm 2020-03-28 19:41:24 0 浏览量 回答数 0

回答

重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念。但是对于新手来说也比较容易混淆。本文通过两个简单的例子说明了他们之间的区别。 定义 重载 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。 重写 重写指的是在Java的子类与父类中有两个名称、参数列表都相同的方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。 重载 VS 重写 关于重载和重写,你应该知道以下几点: 1、重载是一个编译期概念、重写是一个运行期间概念。 2、重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法。 3、重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法 4、因为在编译期已经确定调用哪个方法,所以重载并不是多态。而重写是多态。重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。(注:严格来说,重载是编译时多态,即静态多态。但是,Java中提到的多态,在不特别说明的情况下都指动态多态) 重写的例子 下面是一个重写的例子,看完代码之后不妨猜测一下输出结果: class Dog{ public void bark(){ System.out.println("woof "); } } class Hound extends Dog{ public void sniff(){ System.out.println("sniff "); } public void bark(){ System.out.println("bowl"); } } public class OverridingTest{ public static void main(String [] args){ Dog dog = new Hound(); dog.bark(); } } 输出结果: bowl 上面的例子中,dog对象被定义为Dog类型。在编译期,编译器会检查Dog类中是否有可访问的bark()方法,只要其中包含bark()方法,那么就可以编译通过。在运行期,Hound对象被new出来,并赋值给dog变量,这时,JVM是明确的知道dog变量指向的其实是Hound对象的引用。所以,当dog调用bark()方法的时候,就会调用Hound类中定义的bark()方法。这就是所谓的动态多态性。 重写的条件 参数列表必须完全与被重写方法的相同; 返回类型必须完全与被重写方法的返回类型相同; 访问级别的限制性一定不能比被重写方法的强; 访问级别的限制性可以比被重写方法的弱; 重写方法一定不能抛出新的检查异常或比被重写的方法声明的检查异常更广泛的检查异常 重写的方法能够抛出更少或更有限的异常(也就是说,被重写的方法声明了异常,但重写的方法可以什么也不声明) 不能重写被标示为final的方法; 如果不能继承一个方法,则不能重写这个方法。 重载的例子 class Dog{ public void bark(){ System.out.println("woof "); } //overloading method public void bark(int num){ for(int i=0; i<num; i++) System.out.println("woof "); } } 上面的代码中,定义了两个bark方法,一个是没有参数的bark方法,另外一个是包含一个int类型参数的bark方法。在编译期,编译期可以根据方法签名(方法名和参数情况)情况确定哪个方法被调用。 重载的条件 被重载的方法必须改变参数列表; 被重载的方法可以改变返回类型; 被重载的方法可以改变访问修饰符; 被重载的方法可以声明新的或更广的检查异常; 方法能够在同一个类中或者在一个子类中被重载。 参考资料 Overriding vs. Overloading in Java

montos 2020-06-01 15:49:27 0 浏览量 回答数 0

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19

回答

你这就给别人看一个数组下标越界异常?连栈错误信息也没有? 不好意思 补上了 大神帮帮忙 <p>19-Jul-2018 09:49:55.868 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener]<br>  java.lang.ArrayIndexOutOfBoundsException: 5475     at org.springframework.asm.ClassReader.readClass(Unknown Source)     at org.springframework.asm.ClassReader.accept(Unknown Source)     at org.springframework.asm.ClassReader.accept(Unknown Source)     at org.springframework.core.LocalVariableTableParameterNameDiscoverer.inspectClass(LocalVariableTableParameterNameDiscoverer.java:114)     at org.springframework.core.LocalVariableTableParameterNameDiscoverer.getParameterNames(LocalVariableTableParameterNameDiscoverer.java:86)     at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:193)     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)     at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4753)     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5215)     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)     at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1736)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:498)     at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)     at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)     at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)     at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482)     at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:498)     at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)     at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)     at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)     at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)     at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)     at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)     at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)     at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:498)     at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:361)     at sun.rmi.transport.Transport$1.run(Transport.java:200)     at sun.rmi.transport.Transport$1.run(Transport.java:197)     at java.security.AccessController.doPrivileged(Native Method)     at sun.rmi.transport.Transport.serviceCall(Transport.java:196)     at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)     at java.security.AccessController.doPrivileged(Native Method)     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)     at java.lang.Thread.run(Thread.java:748) 回复 <a class="referer" target="_blank">@丶小宝</a> : 最后怎么解决的啊,我也遇到了,急需解决 回复 <a class="referer" target="_blank">@R-Lu</a> : 非常感谢,是spring的版本冲突了, 自己写了个连接池使用@service注入使用的 这种数组越界报错,之前碰到一些。网上说法大体有两种,容器 JDK版本有问题,没有用对,大部分人尝试之后,说8的版本就可以了。另外就是引用的包冲突了,检查一下包的冲突,如果你用的是Maven的话。 <pre><!--配置connection-factory,指定连接rabbit server参数--> <rabbit:connection-factory id="connectionFactory" username="guest" password="guest" host="localhost" port="5672" virtual-host="/" channel-cache-size="50" /> <!--<rabbit:admin connection-factory="connectionFactory"/>--> <!--定义queue--> <rabbit:queue id="INVEST" name="INVEST" durable="true" auto-delete="false" exclusive="false"/> <!-- 定义direct exchange,绑定com.mj.test queue --> <rabbit:direct-exchange name="myChange" durable="true" auto-delete="false"> <rabbit:bindings> <rabbit:binding queue="INVEST" key="testKey"></rabbit:binding> </rabbit:bindings> </rabbit:direct-exchange> <!--定义rabbit template用于数据的接收和发送--> <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="myChange" /> 加上rabbit:template或rabbit:admin标签,或者直接在配置文件中加上 <bean id="amqpTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate" ></bean> 都会报上面的错误

爱吃鱼的程序员 2020-06-06 16:41:51 0 浏览量 回答数 0

问题

Tomcat7 新连接池的关闭时抛出异常问题

落地花开啦 2019-12-01 19:26:14 1067 浏览量 回答数 1

回答

该错误是因为:1、内嵌jetty在运行时会锁定静态资源;因此在运行过程中不能删除静态资源;2、问题的根源是启动了多个jetty实例,但是实际没有报端口冲突,可以检查任务管理器看是否有多个java/javaw进程在运行,如果是杀掉进程然后重试。 配置这个没? <mvc:resourcesmapping=""location=""/> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> <!--配置设配器由于配置过多的handler不方便mvc标签使用可以扫面包下面所有的Controller--><!--扫描Controller--><context:component-scanbase-package="com.sandy.ssm.controller"></context:component-scan><!--注解处理器映射器--><!--conversion-service转换器--><mvc:annotation-drivenconversion-service="conversionService"></mvc:annotation-driven><!--静态资源访问--><mvc:resourceslocation="/img/"mapping="/img/**"/><mvc:resourceslocation="/js/"mapping="/js/**"/><!--视图解析器--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置视图前端--><propertyname="prefix"value="/WEB-INF/jsp/"/><propertyname="suffix"value=".jsp"/></bean><!--自定义参数绑定--><beanid="conversionService"class="org.springframework.format.support.FormattingConversionServiceFactoryBean"><!--转换器--><propertyname="converters"><list><!--日期类型转换--><beanclass="com.sandy.ssm.controller.converter.CustomDateConverter"/></list></property></bean><!--全局异常处理器--><beanclass="com.sandy.ssm.exception.ExceptionHandler"></bean><!--文件上传--><beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置上传文件的最大尺寸为5MB--><propertyname="defaultEncoding"value="utf-8"></property><propertyname="maxUploadSize"value="5242880"></property></bean><!--拦截器--> /mvc:annotation-driven这些换成下面的试试 第一次启动会显示下面的错误但是能正常访问我就是想知道这个报错是什么问题第二次访问就没有问题了。、 EBUG[http-8080-1]-OriginalConversionServiceattemptfailed-ignoredsincePropertyEditorbasedconversioneventuallysucceededorg.springframework.core.convert.ConversionFailedException:Failedtoconvertfromtypejava.util.ArrayList<?>totypejava.util.Listforvalue'[/js/]';nestedexceptionisorg.springframework.core.convert.ConverterNotFoundException:Noconverterfoundcapableofconvertingfromtypejava.lang.Stringtotypeorg.springframework.core.io.Resourceatorg.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41)atorg.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:169)atorg.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:161)atorg.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:450)atorg.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:496)atorg.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:490)atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1437)atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1396)atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1132)atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522)atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)atorg.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)atorg.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)atorg.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)atorg.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)atorg.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)atorg.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)atorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)atorg.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)atorg.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)atorg.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)atorg.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)atorg.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)atorg.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)atjavax.servlet.GenericServlet.init(GenericServlet.java:212)atorg.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1213)atorg.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:827)atorg.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)atorg.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)atorg.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)atorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)atorg.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)atorg.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)atorg.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)atorg.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)atorg.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)atjava.lang.Thread.run(Thread.java:662)Causedby:org.springframework.core.convert.ConverterNotFoundException:Noconverterfoundcapableofconvertingfromtypejava.lang.Stringtotypeorg.springframework.core.io.Resourceatorg.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:276)atorg.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:172)atorg.springframework.core.convert.support.CollectionToCollectionConverter.convert(CollectionToCollectionConverter.java:74)atorg.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:35)...36more 添加这个看看 <mvc:default-servlet-handler/>

爱吃鱼的程序员 2020-06-24 14:15:23 0 浏览量 回答数 0

回答

何时会内存泄漏:一.资源释放问题:程序代码的问题,长期保持某些资源,如Context,Cursor,IO流的引用,资源得不到释放造成内存泄漏.二.对象内存过大:保存了多个耗用内存过大的对象,如 Bitmap,XML文件,造成内存超出限制。三.static关键字的使用问题:static是java中的一个关键字,当用它修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果他用来引用一下资源耗费过多的实例(Context的情况最多),这时就要谨慎对待。-------针对static的解决方案:1)应该尽量避免static成员变量引用资源耗费过多的实例。如Context。2)Context尽量使用ApplicationContext,因为Application的Context的生命周期比较长,引用它不会出现内训泄漏的问题。3)使用WeakReference代替引用,比如可以使用WeakReference mContextRef.四.线程导致内存溢出:线程产生内存泄漏的主要原因是在于线程的生命周期不可控。-------针对这种线程的内存泄漏问题的解决方案:1)将线程的内部类(因为非静态内部类拥有外部类对象的强引用,而静态类则不拥有)。2)在线程内部采用弱引用保存Context的引用。五.查询数据库没有关闭cursor:程序中经常用到会进行查询数据库的操作,但是经常会使用完毕Cursor后没有关闭的情况,如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在长时间大量操作的情况下才会出现内存问题,这样就会给以后的测试和问题排查带来困难和风险。六.构造Adapter没有复用ConvertView:在使用listview的时候通常使用Adapter,那么 我们应该尽可能的使用ConvertView。为什么要复用ConvertView?当ContertView为空时,用setTag()方法为每一个View绑定一个存放控件的ViewHolder对象,当convertVIew不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。七.Bitmap不在使用时没有调用recycle()释放内存:有时我们会手动的操作Bitmap对象比较占内存,当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占的内存,但这不是必须的,视情况而定。内存泄漏会抛哪些异常: OutOfMemoryError异常

小川游鱼 2019-12-02 01:49:36 0 浏览量 回答数 0

问题

使用SocketChannel的NIO客户机服务器通信示例:报错

kun坤 2020-06-07 16:01:28 0 浏览量 回答数 1

回答

1、使用PrearedStatementPrearedStatement接口是Statement接口的子接口,它继承了Statement的所有功能。多次执行同一语句时,PreparedStatment对SQL的预编译可以提高查询效率。PreparedStatment还可以通过预编译的方式避免我们在拼接SQL时造成SQL注入。2、使用ConnectionPool(连接池)使用连接池作为最佳实践几乎都成了公认的标准。一些框架已经提供了内建的连接池支持, 例如Spring中的Database Connection Pool,如果你的应用部署在JavaEE的应用服务器中, 例如JBoss,WAS,这些服务器也会有内建的连接池支持,例如DBCP。 使用连接的原因简单的说就是因为创建JDBC连接耗时比较长,如果每次查询都重新打开一个连接, 然后关闭,性能将会非常低,而如果事先创建好一批连接缓存起来,使用的时候取出, 不使用的时候仍不关闭,将会节省大量的创建关闭连接的时间。3、禁用自动提交这个最佳实践在我们使用JDBC的批量提交的时候显得非常有用,将自动提交禁用后, 你可以将一组数据库操作放在一个事务中,而自动提交模式每次执行SQL语句都将执行自己的事务, 并且在执行结束提交。4、使用Batch UpdateJDBC的API提供了通过addBatch()方法向batch中添加SQL查询,然后通过executeBatch()执行批量的查询。 JDBC batch update可以减少数据库数据传输的往返次数,从而提高性能。5、使用列名获取ResultSet中的数据,从而避免invalidColumIndexErrorJDBC中的查询结果封装在ResultSet中,我们可以通过列名和列序号两种方 式获取查询的数据, 当我们传入的列序号不正确的时候,就会抛出invalidColumIndexException, 例如你传入了0,就会出错,因为ResultSet中的列序号是从1开始的。 另外,如果你更改了数据表中列的顺序,你也不必更改JDBC代码,保持了程序的健壮性。 有一些Java程序员 可能会说通过序号访问列要比列名访问快一些,确实是这样,但是为了程序的健壮性、可读性,我还是更推荐你使用列名来访问。6、 使用变量绑定而不是字符串拼接在第一条最佳实践中,我们已经说过要使用PreparedStatment可以防止注入,而使用? 或者其他占位符也会提升性能,因为这样数据库就可以使用不同的参数执行相同的查询, 这个最佳实践带来更高的性能的同时也防止了SQL注入。7、要记住关闭Statement、PreparedStatement和Connection通常的做法是在finally块中关闭它们,这样做的好处是不论语句执行正确与否, 不管是否有异常抛出,都能保证资源被释放。在Java7中,可以通过Automatic Resource Management Block来自动的关闭资源。8、选择合适的JDBC驱动有四种JDBC驱动,分别是JDBC-ODBC Bridge driver (bridge driver)Native-API/partly Java driver (native driver)AllJava/Net-protocol driver (middleware driver)All Java/Native-protocol driver (Pure java driver)9、尽量使用标准的SQL语句,从而在某种程度上避免数据库对SQL支持的差异不同的数据库厂商的数据库产品支持的SQL的语法会有一定的出入,为了方便移植,我推荐使用标准的ANSI SQL标准写SQL语句。10、使用正确的getXXX()方法当从ResultSet中读取数据的时候,虽然JDBC允许你使用getString()和getObject()方法获取任何数据类型, 推荐使用正确的getXXX方法,这样可以避免数据类型转换。

wangccsy 2019-12-02 01:49:01 0 浏览量 回答数 0

问题

android 手机端从服务器端读取数据库的文件,抛出异常::报错

kun坤 2020-06-07 14:36:42 0 浏览量 回答数 1

问题

【精品问答】Java必备核心知识1000+(附源码)

问问小秘 2019-12-01 22:00:28 870 浏览量 回答数 1

问题

最近看netty发现发送并发请求数总是多于接受到的请求数而且数字不固定,请大神帮忙? 400 报错

爱吃鱼的程序员 2020-05-29 20:31:32 0 浏览量 回答数 1

问题

号码隐私保护 AXN绑定接口

猫饭先生 2019-12-01 21:00:21 1624 浏览量 回答数 0

回答

1.弱口令漏洞 解决方案:最好使用至少6位的数字、字母及特殊字符组合作为密码。数据库不要存储明文密码,应存储MD5加密后的密文,由于目前普通的MD5加密已经可以被破解,最好可以多重MD5加密。 2.未使用用户名及密码登录后台可直接输入后台URL登录系统。 解决方案:通过配置filter来过滤掉无效用户的连接请求。 3.JSP页面抛出的异常可能暴露程序信息。有经验的入侵者,可以从JSP程序的异常中获取很多信息,比如程序的部分架构、程序的物理路径、SQL注入爆出来的信息等。 解决方案:自定义一个Exception,将异常信息包装起来不要抛到页面上。 4.合法用户“注销”后,在未关闭浏览器的情况下,点击浏览器“后退”按钮,可从本地页面缓存中读取数据,绕过了服务端filter过滤。解决方案:配置filter对存放敏感信息的页面限制页面缓存。如: 在CODE上查看代码片派生到我的代码片httpResponse.setHeader("Cache-Control","no-cache"); httpResponse.setHeader("Cache-Control","no-store"); httpResponse.setDateHeader("Expires", 0); httpResponse.setHeader("Pragma","no-cache"); 5.SQL注入漏洞。 解决方案:在数据库访问层中不要使用“+”来拼接SQL语句!如: 在CODE上查看代码片派生到我的代码片String sql= “SELECT * FROM USERS WHERE 1=1”; if(null != user.getUserName() && !””.equals(user.getUserName())){ sql += “ and UNAME = ‘”+user.getUserName()+”’”; } 而应使用PreparedStatement。如:在CODE上查看代码片派生到我的代码片PreparedStatement pstmt = con.prepareStatement("SELECT * FROM USERS WHERE UNAME=?"); pstmt.setString(1, “Neeke”); 冒号后面是一个named parameter,我们可以使用Query接口将一个参数绑定到name参数上:在CODE上查看代码片派生到我的代码片List result = session.createQuery(queryString) .setString("name", user.getUserName()) .list(); 6.文件上传漏洞。前台仅使用JS对文件后缀做了过滤,这只能针对普通的用户,而恶意攻击者完全可以修改表单去掉JS校验。 解决方案:前台JS过滤加服务器端程序过滤。具体过滤掉哪些文件类型视具体情况而定。 7.可执行脚本漏洞。对用户提交的数据未转义,一些用户提交的含有JavaScript脚本的信息被直接输出到页面中从而被浏览器执行。 解决方案:使用org.apache.commons.lang.StringEscapeUtils对用户提交的数据进行转义。如: 在CODE上查看代码片派生到我的代码片复制代码@RequestMapping(params="method=addTopic",method=RequestMethod.POST) public ModelAndView addTopic(HttpServletRequest request, HttpServletResponse response, BbsTopic topic) { BaseAdmin user = (BaseAdmin) request.getSession().getAttribute(Constant.SESSION_USER); topic.setBaseAdmin(user); topic.setTopicDate(new Timestamp(System.currentTimeMillis())); topic.setTopicContent(StringEscapeUtils.escapeHtml(topic.getTopicContent())); topic.setTopicTitle(StringEscapeUtils.escapeHtml(topic.getTopicTitle())); this.bbsTopicService.save(topic); return new ModelAndView(new RedirectView("bbs.do?method=topicList&bfid="+ topic.getBfid())); } 复制代码 8.Java WEB容器默认配置漏洞。如TOMCAT后台管理漏洞,默认用户名及密码登录后可直接上传war文件获取webshell。 解决方案:最好删除,如需要使用它来管理维护,可更改其默认路径,口令及密码。

asdasdasd222 2019-12-02 01:40:05 0 浏览量 回答数 0

问题

号码隐私保护解绑接口

猫饭先生 2019-12-01 21:00:22 1030 浏览量 回答数 0

问题

Eclipse PyDev自动完成问题

祖安文状元 2020-02-22 15:33:49 0 浏览量 回答数 1

问题

健康检查常见问题

行者武松 2019-12-01 21:43:15 3573 浏览量 回答数 0

问题

Android-SDK之如何实现初始化?

青衫无名 2019-12-01 21:41:13 1334 浏览量 回答数 0

问题

【精品问答】Java经典问答之SpringBoot 100问

问问小秘 2019-12-01 22:00:40 1176 浏览量 回答数 0

问题

【精品问答】Java微服务架构之Spring Boot核心知识 100问(附源码)

游客pklijor6gytpx 2019-12-01 22:04:21 850 浏览量 回答数 0

问题

刚学习strut2出现了一个前后台交互的问题?报错

爱吃鱼的程序员 2020-06-15 19:42:02 0 浏览量 回答数 1

问题

【精品问答】CDN

montos 2020-04-09 09:57:08 8 浏览量 回答数 1

回答

一.Lock接口(java.util.concurrent.locks): void lock():获取锁,阻塞方式;如果资源已被其他线程锁定,那么lock将会阻塞直到获取锁,锁阻塞期间不受线程的Interrupt的影响,在获取锁成功后,才会检测线程的interrupt状态,如果interrupt=true,则抛出异常。 unlock():释放锁 tryLock():尝试获取锁,并发环境中"闯入"行为,如果有锁可用,直接获取锁并返回true,否则范围false. lockInterruptibly():尝试获取锁,并支持"中断"请求。与lock的区别时,此方法的开始、结束和执行过程中,都会不断检测线程的interrupt状态,如果线程被中断,则立即抛出异常;而不像lock方法那样只会在获取锁之后才检测。 二.Lock接口实现类 Lock直接实现,只有3个类:ReentrantLock和WriteLock/ReadLock;这三种锁;Lock和java的synchronized(内置锁)的功能一致,均为排他锁. ReentrantLock为重入排他锁,对于同一线程,如果它已经持有了锁,那么将不会再次获取锁,而直接可以使用. ReentrantReadWriteLock并没有继承ReentrantLock,而是一个基于Lock接口的单独实现.它实现了 ReadWriteLock,即读写分离锁,是一种采用锁分离技巧的API. 尽管在API级别ReentrantReadWriteLock和ReentrantLock没有直接继承关系,但是ReentrantReadWriteLock中的ReadLock和WriteLock都具有ReentrantLock的全部语义(简单说,就是把ReentrantLock的代码copy了一下.),即锁的可重入性.WriteLock支持Condition(条件),ReadLock不支持. Lock的实现类中,都包含了2中锁等待策略:公平和非公平;其实他们的实现也非常简单,底层都是使用了queue来维持锁请求顺序.[参考:http://shift-alt-ctrl.iteye.com/blog/1839142] 公平锁,就是任何锁请求,首先将请求加入队列,然后再有队列机制来决定,是阻塞还是分配锁. 非公平,就是允许"闯入",当然公平锁,也无法干扰"闯入",对于任何锁请求,首先检测锁状态是否可用,如果可用直接获取,否则加入队列.. ReentrantLock本质上和synchronized修饰词是同一语义,如果一个线程lock()之后,其他线程进行lock时必须阻塞,直到当前线程的前续线程unlock.[执行lock操作时,将会被队列化(假如在公平模式下),获取lock的线程都将具有前续/后继线程,前续线程就是当前线程之前执行lock操作而阻塞的线程,后继线程就是当前线程之后执行lock操作的线程;那么对于unlock操作就是"解锁"信号的传递,如果当前线程unlock,那么将会触发后继线程被"唤醒",即它因为lock操作阻塞状态被解除.];这是ReentrantLock的基本原理,但是当ReentrantLock在Conditon情况下,事情就变得更加复杂.[参加下述] 三.Condition:锁条件 Condition与Lock形成happen-before关系。Condition将Object的监视器方法(wait,notify,notifyAll)分解成截然不同的对象,以便通过这些对象与任意Lock实现组合。使Lock具有等待“集合”的特性,或者“类型”;Lock替代了synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。(synchronized + object.wait对应Lock + Condition.await) Condition又称条件队列,为线程提供了一个含义,以便在某种状态条件现在可能为true的其他线程通知它之前,一直挂起该线程。即多个线程,其中一个线程因为某个条件而阻塞,其他线程当“条件”满足时,则“通知”哪些阻塞的线程。这,几乎和object中wait和notify的机制一样。 Condition和wait一样,阻塞时也将原子性的释放锁(间接执行了release()方法)。并挂起线程。Condition必须与Lock形成关系,只有获取lock权限的,才能进行Condition操作。Condition底层基于AQS实现,条件阻塞,将以队列的方式,LockSupport支持。其实现类有ConditionObject,这也是Lock.newCondition()的返回实际类型,在等待 Condition 时,允许发生“虚假唤醒”,这通常作为对基础平台语义的让步。对于大多数应用程序,这带来的实际影响很小,因为 Condition 应该总是在一个循环中被等待,并测试正被等待的状态声明。某个实现可以随意移除可能的虚假唤醒,但建议应用程序程序员总是假定这些虚假唤醒可能发生,因此总是在一个循环中等待。 void await() throws InterruptedException:当前线程阻塞,并原子性释放对象锁。如下条件将触发线程唤醒: 当线程被中断(支持中断响应), 其他线程通过condition.signal()方法,且碰巧选中当前线程唤醒 其他线程通过condition.signalAll()方法 发生虚假唤醒 底层实现,await()方法将当前线程信息添加到Conditon内部维护的"await"线程队列的尾部(此队列的目的就是为singal方法保持亟待唤醒的线程的顺序),然后释放锁(执行tryRelease()方法,注意此处释放锁,仅仅是释放了锁信号,并不是unlock,此时其他线程仍不能获取锁--lock方法阻塞),然后使用LockSupport.park(this)来强制剥夺当前线程执行权限。await方法会校验线程的中断标记。 由此可见,await()方法执行之后,因为已经"归还"了锁信号,那么其他线程此时执行lock方法,将不再阻塞.. void awaitUninterruptibly():阻塞,直到被唤醒。此方法不响应线程中断请求。即当线程被中断时,它将继续等待,直到接收到signal信号(你应该能想到"陷阱"),当最终从此方法返回时,仍然将设置其中断状态。 void signal()/signalAll():唤醒一个/全部await的线程。 对于signal()方法而言,底层实现为,遍历await"线程队列,找出此condition上最先阻塞的线程,并将此阻塞线程unpark.至此为止,我们似乎发现"锁信号"丢失了,因为在线程await时通过tryRelease时释放了一次信号.那么被signal成功的线程,首先执行一次acquire(增加锁信号),然后校验自己是否被interrupted,如果锁信号获取成功且线程状态正常,此时才正常的从await()方法退出.经过这么复杂的分析,终于明白了ReentrantLock + Condition情况下,锁状态变更和线程控制的来龙去脉... Java代码 收藏代码 //////例子: private Lock lock = new ReentrantLock(); private Condition full = lock.newCondition(); private Condition empty = lock.newCondition(); public Object take(){ lock.lock(); try{ while(isEmpty()){ empty.await() } Object o = get() full.signalAll(); return o; }finally{ lock.unlock(); } } public void put(Object o){ lock.lock(); try{ while(isFull()){ full.await(); } put(o); empty.signalAll(); }finally{ lock.unlock(); } } 四.机制 Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。注意,Lock 实例只是普通的对象,其本身可以在 synchronized 语句中作为目标使用。获取 Lock 实例的监视器锁与调用该实例的任何 lock() 方法没有特别的关系。为了避免混淆,建议除了在其自身的实现中之外,决不要以这种方式使用 Lock 实例。 Lock接口具有的方法: void lock():获取锁,阻塞直到获取。 void lockInterruptibly() throws InterrutedException:获取锁,阻塞直到获取成功,支持中断响应。 boolean tryLock():尝试获取锁,返回是否获取的结果。如果碰巧获取成功,则返回true,此时已经持有锁。 boolean tryLock(long time,TimeUnit) throws InterruptedException:尝试获取锁,获取成功返回true,超时时且没有获取锁则返回false。 void unlock():释放锁。约定只有持有锁者才能释放锁,否则抛出异常。 void newCondition():返回绑定到lock的条件。 五.ReadWriteLock ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer(写锁),读取锁可以由多个 reader 线程同时保持(共享锁)。写入锁是独占的。所有 ReadWriteLock 实现都必须保证 writeLock 操作的内存同步效果也要保持与相关 readLock 的联系。也就是说,成功获取读锁的线程会看到写入锁之前版本所做的所有更新。 与互斥锁相比,读-写锁允许对共享数据进行更高级别的并发访问。虽然一次只有一个线程(writer 线程)可以修改共享数据,但在许多情况下,任何数量的线程可以同时读取共享数据(reader 线程),读-写锁利用了这一点。从理论上讲,与互斥锁相比,使用读-写锁所允许的并发性增强将带来更大的性能提高。在实践中,只有在多处理器上并且只在访问模式适用于共享数据时,才能完全实现并发性增强。 Lock readLock():返回读锁。 Lock writeLock():返回写锁。 六.ReentrantLock ReentrantLock,重入排它锁,它和synchronized具有相同的语义以及在监视器上具有相同的行为,但是功能更加强大。 ReetrantLock将由最近成功获得锁且还没有释放锁的线程标记为“锁占有者”;当锁没有被线程持有时,调用lock方法将会成功获取锁并返回,如果当前线程为锁持有者,再次调用lock将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。 ReentrantLock的构造方法,允许接收一个“公平策略”参数,“公平策略”下,多个线程竞争获取锁时,将会以队列化锁请求者,并将锁授予队列的head。在“非公平策略”下,则不完全保证锁获取的顺序,允许闯入行为(tryLock)。 ReentrantLock基于AQS机制,锁信号量为1,如果信号量为1且当前锁持有者不为自己,则不能获取锁。释放锁时,如果当前锁持有者不是自己,也将抛出“IllegalMonitorStateException”。由此可见,对于ReentrantLock,lock和release方法是需要组合出现。 七.ReentrantReadWriteLock:可重入读写分离锁 重入性 :当前线程可以重新获取相应的“读锁”或者“写锁”,在写入线程保持的所有写入锁都已经释放后,才允许重入reader(读取线程)使用它们。writer线程可以获取读锁,但是reader线程却不能直接获取写锁。 锁降级:重入还允许写入锁降级为读锁,其实现方式为:先获取写入锁,然后获取读取锁,最后释放写入锁。但是读取锁不能升级为写入锁。 Conditon的支持:只有写入锁支持conditon,对于读取锁,newConditon方法直接抛出UnsupportedOperationException。 ReentrantReadWriteLock目前在java api中无直接使用。ReentrantReadWriteLock并没有继承自 ReentrantLock,而是单独重新实现。其内部仍然支持“公平性”“非公平性”策略。 ReentrantReadWriteLock基于AQS,但是AQS只有一个state来表示锁的状态,所以如果一个state表示2种类型的锁状态,它做了一个很简单的策略,“位运算”,将一个int类型的state拆分为2个16位段,左端表示readlock锁引用计数,右端16位表示write锁。在readLock、writeLock进行获取锁或者释放锁时,均是通过有效的位运算和位控制,来达到预期的效果。 八.ReadLock void lock():获取读取锁,伪代码如下: Java代码 收藏代码 //如果当前已经有“写锁”,且持有写锁者不是当前线程(如果是当前线程,则支持写锁,降级为读锁),则获取锁失败 //即任何读锁的获取,必须等待队列中的写锁释放 //c为实际锁引用量(exclusiveCount方法实现为:c & ((1<<16) -1) if (exclusiveCount(c) != 0 &&getExclusiveOwnerThread() != current) return -1; //CAS操作,操作state的左端16位。 if(CAS(c,c + (1<<16))){ return 1; } void unlock():释放read锁,即共享锁,伪代码如下: Java代码 收藏代码 //CAS锁引用 for (;;) { int c = getState(); int nextc = c - (1<<16);//位操作,释放一个锁。 if (compareAndSetState(c, nextc)) return nextc == 0; } 九.WriteLock void lock():获取写入锁,伪代码如下: Java代码 收藏代码 //当前线程 Thread current = Thread.currentThread(); //实际的锁引用state int c = getState(); //右端16位,通过位运算获取“写入锁”的state int w = exclusiveCount(c); //如果有锁引用 if (c != 0) { //且所引用不是自己 if (w == 0 || current != getExclusiveOwnerThread()){ return false; } } //如果写入锁state为0,且CAS成功,则设置state和独占线程信息 if ((w == 0 && writerShouldBlock(current)) ||!compareAndSetState(c, c + acquires)){ return false; } setExclusiveOwnerThread(current); return true; void unlock():释放写入锁,伪代码如下: Java代码 收藏代码 //计算释放锁的信号量 int nextc = getState() - releases; //对于写入锁,则校验当前线程是否为锁持有者,否则不可以释放(死锁) if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); //释放锁,且重置独占线程信息 if (exclusiveCount(nextc) == 0) { setExclusiveOwnerThread(null); setState(nextc); return true; } else { setState(nextc); return false; } 十.LockSupport:用来创建锁和其他同步类的基本线程阻塞原语。 底层基于hotspot的实现unsafe。park 和 unpark 方法提供了阻塞和解除阻塞线程的有效方法。三种形式的 park(即park,parkNanos(Object blocker,long nanos),parkUntil(Object blocker,long timestamp)) 还各自支持一个 blocker 对象参数。此对象在线程受阻塞时被记录,以允许监视工具和诊断工具确定线程受阻塞的原因。(这样的工具可以使用方法 getBlocker(java.lang.Thread) 访问 blocker。)建议最好使用这些形式,而不是不带此参数的原始形式。 在锁实现中提供的作为 blocker 的普通参数是 this。 static void park(Object blocker):阻塞当前线程,直到如下情况发生: 其他线程,调用unpark方法,并将此线程作为目标而唤醒 其他线程中断当前线程此方法不报告,此线程是何种原因被放回,需要调用者重新检测,而且此方法也经常在while循环中执行 Java代码 收藏代码 while(//condition,such as:queue.isEmpty){ LockSupport.park(queue);//此时queue对象作为“阻塞”点传入,以便其他监控工具查看,queue的状态 //检测当前线程是否已经中断。 if(Thread.interrupted()){ break; } } void getBlocker(Thread t):返回提供最近一次尚未解除阻塞的park的阻塞点。可以返回null。 void unpark(Thread t):解除指定线程阻塞,使其可用。参数null则无效果。 LockSupport实例(不过不建议在实际代码中直接使用LockSupport,很多时候,你可以使用锁来控制): Java代码 收藏代码 /////////////Demo public class LockSupportTestMain { /** * @param args */ public static void main(String[] args) throws Exception{ System.out.println("Hear!"); BlockerObject blocker = new BlockerObject(); LThread tp = new LThread(blocker, false); LThread tt = new LThread(blocker, true); tp.start(); tt.start(); Thread.sleep(1000); } static class LThread extends Thread{ private BlockerObject blocker; boolean take; LThread(BlockerObject blocker,boolean take){ this.blocker = blocker; this.take = take; } @Override public void run(){ if(take){ while(true){ Object o = blocker.take(); if(o != null){ System.out.println(o.toString()); } } }else{ Object o = new Object(); System.out.println("put,,," + o.toString()); blocker.put(o); } } } static class BlockerObject{ Queue<Object> inner = new LinkedList<Object>(); Queue<Thread> twaiters = new LinkedList<Thread>(); Queue<Thread> pwaiters = new LinkedList<Thread>(); public void put(Object o){ inner.offer(o); pwaiters.offer(Thread.currentThread()); Thread t = twaiters.poll(); if(t != null){ LockSupport.unpark(t); } System.out.println("park"); LockSupport.park(Thread.currentThread()); System.out.println("park is over"); } public Object take(){ Thread t = pwaiters.poll(); if(t != null){ System.out.println("unpark"); LockSupport.unpark(t); System.out.println("unpark is OK"); } //twaiters.offer(Thread.currentThread()); return inner.poll(); } } } 备注:有时候会疑惑wait()/notify() 和Unsafe.park()/unpark()有什么区别?区别是wait和notify是Object类的方法,它们首选需要获得“对象锁”,并在synchronized同步快中执行。park和unpark怎不需要这么做。wait和park都是有当前线程发起,notify和unpark都是其他线程发起。wait针对的是对象锁,park针对的线程本身,但是最终的效果都是导致当前线程阻塞。Unsafe不建议开发者直接使用。

景凌凯 2020-04-24 16:41:16 0 浏览量 回答数 0

回答

<p>还有我的rabbit.xml配置</p> ---------------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"        xmlns:rabbit="http://www.springframework.org/schema/rabbit"        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd     http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.6.xsd">     <!-- rabbitmq连接配置 -->     <rabbit:connection-factory id="connectionFactory"                                virtual-host="testUser"                                host="192.168.53.110"                                username="root" password="123456"                                port="5672" />     <rabbit:admin connection-factory="connectionFactory" />     <!-- 声明消息队列,消息系统监听队列 -->     <!-- messageQueue 是在(1)中创建的队列 -->     <rabbit:queue id="messageQueue" durable="true"                   auto-delete="false" exclusive="false" name="messageQueue" />     <!-- exchange queue binging key 绑定 -->     <!--声明交换 在(1)配置的交换-->     <rabbit:topic-exchange name="messageExchange"                            durable="true" auto-delete="false" id="messageExchange">         <rabbit:bindings>             <!-- 声明队列和交换的关系 -->             <rabbit:binding pattern="message.*" queue="messageQueue"></rabbit:binding>         </rabbit:bindings>     </rabbit:topic-exchange>     <rabbit:template exchange="messageExchange" id="rabbitTemplate"                      connection-factory="connectionFactory"  message-converter="jsonMessageConverter" />     <rabbit:listener-container             connection-factory="connectionFactory" acknowledge="auto">         <!-- 让消费者监听这个队列 -->         <rabbit:listener ref="messageConsumer" queues="messageQueue" />     </rabbit:listener-container>     <!--声明生产者 -->     <bean id="messageSender" class="com.java46.amqp.MessageSender">         <property  name="amqpTemplate" ref="rabbitTemplate" >         </property>         <!-- <property name="routingKey" value="message.test" ></property> -->     </bean>     <!--声明消费者 -->     <bean id="messageConsumer" class="com.java46.amqp.MessageConsumer" />     <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" /> </beans> <p>仔细看异常链吧</p>

爱吃鱼的程序员 2020-06-06 15:41:33 0 浏览量 回答数 0

问题

checkbox传值和取值,循环删除?报错

爱吃鱼的程序员 2020-06-14 17:38:52 0 浏览量 回答数 1

问题

【精品问答】企业级分布式应用服务 EDAS相关了解

montos 2020-04-08 10:53:03 2 浏览量 回答数 1

回答

您可以使用 Pandora Boot 开发 HSF 应用,实现服务注册发现、异步调用,并完成单元测试。相比使用 ali-tomcat 部署 HSF 的 WAR 包,Pandora Boot部署的是 JAR 包。直接将 HSF 应用打包成 FatJar,这更加符合微服务的风格,不需要依赖外置的 ali-tomcat 也使得应用的部署更加灵活。Pandora Boot 可以认为是 Spring Boot 的增强。 前提条件 在开发应用前,您已经完成以下工作: 配置 SAE 的私服地址和轻量级配置及注册中心 启动轻量级配置及注册中心 服务注册与发现 介绍如何使用 Pandora Boot 开发应用(包括服务提供者和服务消费者)并实现服务注册与发现。 注意 严禁在应用启动时调用 HSF 远程服务,否则会导致启动失败。 Demo 源码下载:https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/microservice-doc-demo/hsf-pandora-boot 使用 Git 克隆整个项目,并在 microservice-doc-demo/hsf-pandora-boot 文件夹内可以找到本文使用的示例工程。 创建服务提供者。 创建命名为 hsf-pandora-boot-provider的 Maven 工程。 在 pom.xml 中引入需要的依赖。 <java.version>1.8</java.version> <spring-boot.version>2.1.6.RELEASE</spring-boot.version> <pandora-boot.version>2019-06-stable</pandora-boot.version> com.alibaba.boot pandora-hsf-spring-boot-starter org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-dependencies ${spring-boot.version} pom import com.taobao.pandora pandora-boot-starter-bom ${pandora-boot.version} pom import org.apache.maven.plugins maven-compiler-plugin 3.7.0 1.8 1.8 com.taobao.pandora pandora-boot-maven-plugin 2.1.11.8 package repackage 虽然 HSF 服务框架并不依赖于 Web 环境,但是在应用的生命周期过程中需要使用到 Web 相关的特性,所以需要添加 spring-boot-starter-web 的依赖。 pandora-hsf-spring-boot-starter 实现了 HSF 配置的自动装配。pandora-boot-maven-plugin 是 Pandora Boot 提供的 maven 打包插件,可以将 Pandora Boot HSF 工程编译为可执行的 FatJar,并在 EDAS Container 中部署运行。 dependencyManagement 中包含了 spring-boot-dependencies 和 pandora-boot-starter-bom 两个依赖,分别负责 Spring Boot 和 Pandora Boot 相关依赖的版本管理,设置之后,您的工程无需将 parent 设置为 spring-boot-starter-parent。 定义服务接口,创建一个接口类 com.alibaba.edas.HelloService。 HSF 服务框架基于接口进行服务通信,当接口定义好之后,生产者将通过该接口实现具体的服务并发布,消费者也是基于此接口去订阅和消费服务。 public interface HelloService { String echo(String string); } 接口 com.alibaba.edas.HelloService 提供了 echo 方法。 添加服务提供者的具体实现类 EchoServiceImpl ,并通过注解方式发布服务。 @HSFProvider(serviceInterface = HelloService.class, serviceVersion = "1.0.0") public class HelloServiceImpl implements HelloService { @Override public String echo(String string) { return string; } } 在 HSF 应用中,接口名和服务版本才能唯一确定一个服务,所以在注解 HSFProvider 中的需要添加接口名 com.alibaba.edas.HelloService 和服务版本1.0.0。 说明 注解中的配置拥有高优先级。 如果在注解中没有配置,服务发布时会优先在 resources/application.properties 文件中查找这些属性的全局配置。 如果注解和 resources/application.properties 文件中都没有配置,则会使用注解中的默认值。 在 resources 目录下的 application.properties 文件中配置应用名和监听端口号。 spring.application.name=hsf-pandora-boot-provider server.port=8081 spring.hsf.version=1.0.0 spring.hsf.timeout=3000 说明 建议将服务版本(spring.hsf.version)和服务超时(spring.hsf.timeout)都统一配置在 application.properties 中。 添加服务启动的 main 函数入口。 @SpringBootApplication public class HSFProviderApplication { public static void main(String[] args) { // 启动 Pandora Boot 用于加载 Pandora 容器 PandoraBootstrap.run(args); SpringApplication.run(HSFProviderApplication.class, args); // 标记服务启动完成,并设置线程 wait。防止业务代码运行完毕退出后,导致容器退出。 PandoraBootstrap.markStartupAndWait(); } } 表 1. 服务提供者属性列表 属性 是否必配 描述 类型 默认值 serviceInterface 是 服务对外提供的接口 Class java.lang.Object serviceVersion 否 服务的版本号 String 1.0.0.DAILY serviceGroup 否 服务的组名 String HSF clientTimeout 否 该配置对接口中的所有方法生效,但是如果客户端通过 methodSpecials 属性对某方法配置了超时时间,则该方法的超时时间以客户端配置为准。其他方法不受影响,还是以服务端配置为准(单位 ms) int -1 corePoolSize 否 单独针对这个服务设置最小活跃线程数,从公用线程池中划分出来 int 0 maxPoolSize 否 单独针对这个服务设置最大活跃线程数,从公用线程池中划分出来 int 0 delayedPublish 否 是否延迟发布 boolean false includeFilters 否 用户可选的自定义过滤器 String[] 空 enableTXC 否 是否开启分布式事务 GTS boolean false serializeType 否 服务接口序列化类型,hessian 或者 java String hessian supportAsynCall 否 是否支持异步调用 String false 表 2. 服务创建及发布限制 名称 示例 限制大小 是否可调整 {服务名}:{版本号} com.alibaba.edas.testcase.api.TestCase:1.0.0 最大192字节 否 组名 aliware 最大32字节 否 一个Pandora应用实例发布的服务数 N/A 最大800个 是,可在应用基本信息页面单击应用设置右侧的设置,并在下拉列表中选择 JVM,然后在弹出的应用设置对话框中选择自定义 > 自定义参数,在输入框中添加 -DCC.pubCountMax=1200属性参数(该参数值可根据应用实际发布的服务数调整) 创建服务消费者。 本示例中,将创建一个服务消费者,通过 HSFConsumer 所提供的 API 接口去调用服务提供者。 创建一个 Maven 工程,命名为 hsf-pandora-boot-consumer。 在 pom.xml 中引入需要的依赖内容。 说明 消费者和提供者的 Maven 依赖是相同。 <java.version>1.8</java.version> <spring-boot.version>2.1.6.RELEASE</spring-boot.version> <pandora-boot.version>2019-06-stable</pandora-boot.version> com.alibaba.boot pandora-hsf-spring-boot-starter org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-dependencies ${spring-boot.version} pom import com.taobao.pandora pandora-boot-starter-bom ${pandora-boot.version} pom import org.apache.maven.plugins maven-compiler-plugin 3.7.0 1.8 1.8 com.taobao.pandora pandora-boot-maven-plugin 2.1.11.8 package repackage 将服务提供者所发布的 API 服务接口(包括包名)拷贝到本地,如 com.alibaba.edas.HelloService。 public interface HelloService { String echo(String string); } 通过注解的方式将服务消费者的实例注入到 Spring 的 Context 中。 @Configuration public class HsfConfig { @HSFConsumer(clientTimeout = 3000, serviceVersion = "1.0.0") private EchoService echoService; } 说明 在 HsfConfig 类里配置一次 @HSFConsumer,然后在多处通过 @Autowired 注入使用。通常一个 HSF Consumer 需要在多个地方使用,但并不需要在每次使用的地方都用 @HSFConsumer 来标记。只需要写一个统一的 HsfConfig 类,然后在其它需要使用的地方,直接通过 @Autowired 注入即可。 为了便于测试,使用 SimpleController 来暴露一个 /hsf-echo/* 的 HTTP 接口,/hsf-echo/* 接口内部实现调用了 HSF 服务提供者。 @RestController public class SimpleController { @Autowired private HelloService helloService; @RequestMapping(value = "/hsf-echo/{str}", method = RequestMethod.GET) public String echo(@PathVariable String str) { return helloService.echo(str); } } 在 resources 目录下的 application.properties 文件中配置应用名与监听端口号。 spring.application.name=hsf-pandora-boot-consumer server.port=8080 spring.hsf.version=1.0.0 spring.hsf.timeout=1000 说明 建议将服务版本和服务超时都统一配置在 application.properties 中。 添加服务启动的 main 函数入口。 @SpringBootApplication public class HSFConsumerApplication { public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(HSFConsumerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } } 表 3. 服务消费者属性列表 属性 是否必配 描述 类型 默认值 serviceGroup 否 服务的组名 String HSF serviceVersion 否 服务的版本号 String 1.0.0.DAILY clientTimeout 否 客户端统一设置接口中所有方法的超时时间(单位 ms) int -1 generic 否 是否支持泛化调用 boolean false addressWaitTime 否 同步等待服务注册中心( ConfigServer )推送服务提供者地址的时间(单位 ms) int 3000 proxyStyle 否 代理方式(JDK 或 Javassist) String jdk futureMethods 否 设置调用此服务时需要采用异步调用的方法名列表以及异步调用的方式,默认为空,即所有方法都采用同步调用 String[] 空 consistent 否 负载均衡是否使用一致性哈希 String 空 methodSpecials 否 配置方法级的超时时间、重试次数、方法名称 com.alibaba.boot.hsf.annotation.HSFConsumer.ConsumerMethodSpecial[] 空 表 4. 服务提供者和消费者全局配置参数列表 属性 是否必配 描述 类型 默认值 spring.hsf.version 否 服务的全局版本号,还可以使用 spring.hsf.versions.<完整的服务接口名>=<单独为该服务接口设置的版本号,String类型>,例如spring.hsf.versions.com.aliware.edas.EchoService="1.0.0"为具体某个服务设置版本号。 String 1.0.0.DAILY spring.hsf.group 否 服务的全局组名,还可以使用spring.hsf.groups.<完整的服务接口名>=<单独为该服务接口设置的组名,String类型>为具体某个服务设置组名。 String HSF spring.hsf.timeout 否 服务的全局超时时间,还可以使用spring.hsf.timeouts.<完整的服务接口名>=<超时时间,String类型>为具体某个服务设置超时时间。 Integer 无 spring.hsf.max-wait-address-time 否 同步等待服务注册中心( ConfigServer )推送服务提供者地址的全局时间(单位 ms ),还可以使用spring.hsf.max-wait-address-times.<完整的服务接口名>=<等待时间,String类型>为具体某个服务设置的等待服务注册中心(ConfigServer)推送服务提供者地址的时间。 Integer 3000 spring.hsf.delay-publish 否 服务延迟发布的全局开关,”true” or “false”,还可以使用spring.hsf.delay-publishes.<完整的服务接口名>=<是否延迟发布,String类型>为具体某个服务设置是否延迟。 String 无 spring.hsf.core-pool-size 否 服务的全局最小活跃线程数,还可以使用spring.hsf.core-pool-sizes.<完整的服务接口名>=<最小活跃线程数,String类型>单独为某服务设置最小活跃线程数。 int 无 spring.hsf.max-pool-size 否 服务的全局最大活跃线程数,还可以使用spring.hsf.max-pool-sizes.<完整的服务接口名>=<最大活跃线程数,String类型>单独为某服务设置最大活跃线程数。 int 无 spring.hsf.serialize-type 否 服务的全局序列化类型,Hessian 或者 Java,还可以使用spring.hsf.serialize-types.<完整的服务接口名>=<序列化类型>单独为某服务设置序列化类型。 String 无 说明 全局配置参数可在 Pandora Boot 应用的 application.properties 文件中设置。 本地开发调试。 配置轻量级配置及注册中心。 本地开发调试时,需要使用轻量级配置及注册中心,轻量级配置及注册中心包含了服务注册发现服务端的轻量版,详情请参见启动轻量级配置及注册中心。 启动应用。 在 IDE 中启动 通过 VM options 配置启动参数 -Djmenv.tbsite.net={$IP},通过 main 方法直接启动。其中 {$IP} 为轻量配置中心的 IP 地址。列如本机启动轻量配置中心,则 {$IP} 为 127.0.0.1。 您也可以不配置 JVM 的参数,而是直接通过修改 hosts 文件将 jmenv.tbsite.net 绑定为轻量配置中心的 IP。详情请参见启动轻量级配置及注册中心。 通过 FatJar 启动 增加 taobao-hsf.sar 依赖,这样会下载到我们需要的依赖:/.m2/com/taobao/pandora/taobao-hsf.sar/2019-06-stable/taobao-hsf.sar-2019-06-stable.jar,在后面的启动参数中依赖它。 com.taobao.pandora taobao-hsf.sar 2019-06-stable 使用 Maven 将 Pandora Boot 工程打包成 FatJar, 需要在 pom.xml 中添加如下插件。为避免与其他打包插件发生冲突,请勿在 build 的 plugin 中添加其他 FatJar 插件。 com.taobao.pandora pandora-boot-maven-plugin 2.1.11.8 package repackage 添加完插件后,在工程的主目录下,执行 maven 命令 mvn clean package 进行打包,即可在 Target 目录下找到打包好的 FatJar 文件。 通过 Java 命令启动应用。 java -Djmenv.tbsite.net=127.0.0.1 -Dpandora.location=${M2_HOME}/.m2/repository/com/taobao/pandora/taobao-hsf.sar/2019-06-stable/taobao-hsf.sar-2019-06-stable.jar -jar hsf-pandora-boot-provider-1.0.jar 说明 -Dpandora.location 指定的路径必须是全路径,使用命令行启动时,必须显示指定 taobao-hsf.sar 的位置。 访问 consumer 所在机器的地址,可以触发 consumer 远程调用 provider。 curl localhost:8080/hsf-echo/helloworld helloworld 单元测试。 Pandora Boot 的单元测试可以通过 PandoraBootRunner 启动,并与 SpringJUnit4ClassRunner 无缝集成。 我们将演示一下如何在服务提供者中进行单元测试,供大家参考。 在 Maven 中添加 Pandora Boot 和 Spring Boot 测试必要的依赖。 com.taobao.pandora pandora-boot-test test org.springframework.boot spring-boot-starter-test test 编写测试类的代码。 @RunWith(PandoraBootRunner.class) @DelegateTo(SpringJUnit4ClassRunner.class) // 加载测试需要的类,一定要加入 Spring Boot 的启动类,其次需要加入本类。 @SpringBootTest(classes = {HSFProviderApplication.class, HelloServiceTest.class }) @Component public class HelloServiceTest { /** * 当使用 @HSFConsumer 时,一定要在 @SpringBootTest 类加载中,加载本类,通过本类来注入对象,否则当做泛化时,会出现类转换异常。 */ @HSFConsumer(generic = true) HelloService helloService; //普通的调用 @Test public void testInvoke() { TestCase.assertEquals("hello world", helloService.echo("hello world")); } //泛化调用 @Test public void testGenericInvoke() { GenericService service = (GenericService) helloService; Object result = service.$invoke("echo", new String[] {"java.lang.String"}, new Object[] {"hello world"}); TestCase.assertEquals("hello world", result); } //返回值 Mock @Test public void testMock() { HelloService mock = Mockito.mock(HelloService.class, AdditionalAnswers.delegatesTo(helloService)); Mockito.when(mock.echo("")).thenReturn("beta"); TestCase.assertEquals("beta", mock.echo("")); } }

1934890530796658 2020-03-27 18:22:24 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播