从Spring到Java EE 6

我最近在一个非常复杂的项目中工作,其中融合了许多Java EE 6技术(例如JPA,JAXB,JMS,JTA,JAX-RS等)。 出于生产力和计划方面的原因,将原型应用程序设计为独立的纯Spring应用程序。 当实际应用程序的开发开始时,我们重新挑战了最初的选择(即Spring v3),并分析了切换到Java EE 6应用服务器(例如GlassFish或JBoss)的兴趣。
这最终导致两个主要问题:
  • 我们可以在Java EE 6中完成Spring可以做的一切吗?
  • 我们可以像在Spring那样简单吗?

好吧,我要说的是,在全球范围内,答案是:是的,我们可以!

我不想重新开始(无休止的)辩论,要知道在Spring和Java EE 6之间哪个是最好的。 不,我只想与您分享我有关迁移的经验。 我曾经是,现在仍然是一个真正的Spring狂热爱好者(从历史上来说,我是在EJB 1.0令人反感之后才发现的),但我也知道最近在Linux中引入的进展,而不仅仅是简化。这些年来的Java EE,以及Java EE 6应用程序服务器方面令人印象深刻的速度改进。

现在让我们详细研究“企业”应用程序的一些典型要求,并比较在两种情况下要产生的代码:

  • 上下文和依赖注入
  • 讯息传递
  • 交易管理
  • 网页服务

如果您不愿从一种技术迁移到另一种技术,那么这种比较应该为您提供一些具体的决策要素……

第一部分:上下文和依赖注入(CDI)

Spring允许您使用各种构造型(例如@ Repository,@ Service,@ Controller和@Component)定义bean。 选择的选项不是那么重要(这不是完全正确。例如,将DAO标记为@Repository将添加SQL异常的自动翻译),因为这种区别主要是针对IDE的(以便对bean进行分类)。 (可选)您可以为您的bean命名。

public interface MyInterface {...}
import org.springframework.stereotype.Component;@Component("firstBean")
public class MySpringBean implements MyInterface {...}@Component("firstBeanMock")
public class MockImpl implements MyInterface {...}

Java EE提供了非常相似的注释(@Named),但其使用应仅限于纯pojo。 如果是面向服务的Bean(尤其是事务性粗粒度服务),请考虑使用(最好是无状态的)EJB,即因为它们提供了更好的可伸缩性。

import javax.inject.Named;@Named("firstBean")
public class MyJeeBean implements MyInterface {...}
import javax.ejb.Stateless;@Stateless(name="firstService")
public class MyJeeService implements MyInterface {...}

还应注意,与Spring相反,应在Java EE中将单例显式标记为:

import javax.inject.Singleton;@Singleton
public class MyJeeSingleton implements MyInterface {...}

备注:在“ javax.inject.Singleton”和“ javax.ejb.Singleton”之间进行选择时,您可能会感到困惑。 第一个定义由容器(在Java EE世界中也称为“ Managed Bean ”)管理的标准POJO,而第二个定义“ Enterprise Bean”。 请记住,后者是为并发访问而设计的(客户端无需担心可能同时调用单例相同方法的任何其他客户端),并且还提供了事务管理功能(请参阅进一步)。

现在我们已经注册了(并可以选择命名)我们的bean,我们可以将它们注入其他bean中。 再一次,双方的程序有点类似:

弹簧

import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;@Component
public class UseCaseHandler {@Autowired@Qualifier("firstBean")private MyInterface serviceFacade;}

JAVA EE 6

import javax.inject.Named;
import javax.inject.Inject;@Named
public class UseCaseHandler {@Inject@Named("firstBean")  private MyInterface serviceFacade;}

备注:JSR-330统一了注入托管bean的方式。 具体来说,这意味着@Inject批注可用于注入简单的POJO和EJB(从而使@EJB批注过时)。

很好! 但是,在现实世界中,我们要注入的bean的名称(例如“ firstBean”)可能是动态的。 当您使用行为模式,泛型等时,尤其如此。

在Spring,这非常容易。 例如,您可以使您的bean能够识别ApplicationContext,以便随后可以使用注入的Spring上下文来查找特定的bean实例:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;import com.javacodegeeks.Request;@Service
public class Dispatcher implements ApplicationContextAware {private ApplicationContext appContext;public void setApplicationContext(ApplicationContext ctx) throws BeansException {appContext = ctx;}public void dispatch(Request request) throws Exception {String beanName = "requestHandler_" + request.getRequestTypeId();RequestHandler myHandler = appContext.getBean(beanName, RequestHandler.class);myHandler.handleRequest(request);}}
public interface RequestHandler  {public void handleRequest(Request request);
}
@Component("requestHandler_typeA")
public class HandlerA implements RequestHandler {...}
@Component("requestHandler_typeB")
public class HandlerB implements RequestHandler {...}

在Java EE 6中,这是可能的,但是需要更多的代码行(可以集中在帮助程序类中):

import java.util.Set;
import javax.inject.Inject;
import javax.inject.Named;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;import com.javacodegeeks.Request;@Named
public class Dispatcher @Injectprivate BeanManager beanManager;public void dispatch(Request request) throws Exception {String beanName = "requestHandler_" + request.getRequestTypeId();RequestHandler myHandler = this.getBean(beanName, RequestHandler.class);myHandler.handleRequest(request);}@SuppressWarnings("unchecked")private <T> T getBean(String name, Class<T> clazz) throws Exception {Set<Bean<?>> founds = beanManager.getBeans(name);if ( founds.size()==0 ) {throw new Exception("No such bean found: "+name);} else {Bean<T> bean = (Bean<T>) founds.iterator().next();CreationalContext<T> cc = beanManager.createCreationalContext(bean);T instance = (T) beanManager.getReference(bean, clazz, cc);return instance;}}}
public interface RequestHandler  {public void handleRequest(Request request);
}
@Named("requestHandler_typeA")
public class HandlerA implements UseCaseHandler {…}
@Named("requestHandler_typeB")
public class HandlerB implements UseCaseHandler {...}

第二部分:JMS

Java Messaging Service简化了松散耦合的分布式通信的实现。
这就是为什么它已成为企业应用程序集成(EAI)中的经典技术的原因。

Spring具有出色的JMS支持。 您可以非常快速地设置JMS生产者或使用者,
使用目标解析器,还可以选择将JMS消息自动转换为pojos(反之亦然)。 另一方面,J2EE带有一组丰富的注释,以便访问或定义JMS资源,例如队列/主题,连接或面向消息的Bean。

让我们从接收消息的JMS客户端开始,该客户端是消息使用者(或订户):

弹簧

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"><property name="environment"><props>…</props></property>
</bean><bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"><property name="jndiTemplate" ref="jndiTemplate" /><property name="jndiName" value="java:/JmsXA" />
</bean><bean id="jndiDestResolver"class="org.springframework.jms.support.destination.JndiDestinationResolver"><property name="jndiTemplate" ref="jndiTemplate" />
</bean><bean id="jmsContainer"class="org.springframework.jms.listener.DefaultMessageListenerContainer"><property name="connectionFactory" ref="jmsConnectionFactory"/>   <property name="destinationResolver" ref="jndiDestResolver"/>  <property name="destinationName" value="queue/myQueue"/><property name="messageListener" ref="myMsgConsumer" />
</bean><bean id="myMsgConverter" class="com.javacodegeeks.MsgToRequestConverter"/><bean id="myMsgConsumer" class="com.javacodegeeks.MsgConsumer"/>
import javax.jms.Message;
import javax.jms.MessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.support.converter.MessageConverter;import com.javacodegeeks.Request;
import com.javacodegeeks.Dispatcher;/*** Example of message consumer (Message-Driven-Pojo) in Spring*/
public class MsgConsumer implements MessageListener {@Autowiredprivate MessageConverter msgConverter;@Autowiredprivate Dispatcher dispatcher;public void onMessage(Message message) {       try { Request request = (Request) msgConverter.fromMessage(message);dispatcher.dispatch(request); } catch (Exception e) {e.printStackTrace();    } }}

JAVA EE 6

import javax.inject.Inject;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.ejb.MessageDriven;
import javax.ejb.ActivationConfigProperty;import com.javacodegeeks.Request;
import com.javacodegeeks.Dispatcher ;
import com.javacodegeeks.MsgToRequestConverter;/*** Example of message consumer (Message-Driven-Bean) in JEE*/
@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),@ActivationConfigProperty(propertyName="destination", propertyValue="queue/myQueue") 
} )     
public class MsgConsumer implements MessageListener  {@Injectprivate MsgToRequestConverter msgConverter;@Inject private Dispatcher dispatcher;public void onMessage(Message message) {       try { Request request = msgConverter.fromMessage(message);dispatcher.dispatch(request);      } catch (Exception e) {e.printStackTrace();     } }}

现在,让我们编写一个用于创建和发送消息的JMS客户端,即消息生产者(或发布者):

弹簧

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"><property name="environment"><props>…</props></property>
</bean><bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"><property name="jndiTemplate" ref="jndiTemplate" /><property name="jndiName" value="java:/JmsXA" />
</bean><bean id="jndiDestResolver"class="org.springframework.jms.support.destination.JndiDestinationResolver"><property name="jndiTemplate" ref="jndiTemplate" />
</bean><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="jmsConnectionFactory" /><property name="destinationResolver" ref="jndiDestResolver" /><property name="messageConverter" ref="myMsgConverter" />
</bean><bean id="myMsgConverter" class="com.javacodegeeks.MsgConverter">
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import com.javacodegeeks.Request;/*** Example of message producer component in Spring*/
@Component 
public class MsgProducer {@Autowiredprivate JmsTemplate jmsTemplate;public void postRequest(Request request) throws Exception {jmsTemplate.convertAndSend("queue/myQueue", request);}}

JAVA EE 6

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.ejb.Stateless;
import javax.ejb.EJBException;import com.javacodegeeks.Request;
import com.javacodegeeks.MsgToRequestConverter;/*** Example of message producer (here a session bean) in JEE*/
@Stateless(name="msgProducer")
public class MsgProducer {@Injectprivate MsgToRequestConverter msgConverter;@Resource(mappedName="java:/JmsXA")private ConnectionFactory connectionFactory;@Resource(mappedName="queue/myQueue")private Queue queue;private Connection jmsConnection;@PostConstructprivate void initialize() {try {jmsConnection = connectionFactory.createConnection();} catch (JMSException e) {throw new EJBException(e);}}@PreDestroyprivate void cleanup() {try {if (jmsConnection!=null) jmsConnection.close();} catch (JMSException e) {throw new EJBException(e);}}public void postRequest(Request request) throws Exception { Session session = null;MessageProducer producer = null;try {session = jmsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);producer = session.createProducer(queue);Message msg = msgConverter.toMessage(request, session);producer.send(msg);  } finally { try { if (producer!=null) producer.close();if (session!=null) session.close();} catch (Exception e) {System.err.println("JMS session not properly closed: "+ e);}}}}

备注:

  • 不要忘记,与JMS连接和JMS队列相反,JMS会话不是线程安全的。 因此,会话不应由所有bean实例共享,也不应在构造函数或PostConstruct方法中创建。
  • PostConstruct和PreDestroy方法应该只抛出运行时异常。 这就是为什么必须将JMS异常(例如)包装到EJB异常中的原因。

第三部分:交易管理

事务的需求在系统体系结构中至关重要,尤其是在SOA出现时。 在这样的体系结构中,可以通过组装现有的(可能还有交易的)较小的服务(“ 微服务 ”)来构建粗粒度的交易服务。

Spring和Java EE都通过提供强大的声明式(基于注释)事务管理来满足这一需求。

弹簧

<!-- Recognize @Transactional annotations in our beans --> 
<tx:annotation-driven transaction-manager="txManager"/><!-- The transaction manager to use (here the JPA implementation) --> 
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">...
</bean>
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Propagation;import com.javacodegeeks.Request;
import com.javacodegeeks.RequestProcessor;@Service
public class RequestProcessorImpl implements RequestProcessor {@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void process(Request request) throws Exception {...}}

JAVA EE 6

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;import com.javacodegeeks.Request;
import com.javacodegeeks.RequestProcessor;@Stateless
@TransactionManagement(value=TransactionManagementType.CONTAINER)
public class RequestProcessorImpl implements RequestProcessor {@TransactionAttribute(TransactionAttributeType.REQUIRED)public void process(Request request) throws Exception {...}}

对Java EE中的运行时/未经检查的异常要非常小心。 默认情况下,它们被EJB容器自动包装到EJBException中,这可能会导致令人惊讶的结果(尤其是在try…catch语句中!)。 如果您需要对回滚情况进行更好的调整,请考虑使用@ApplicationException批注或通过如下扩展ejb描述符将此类运行时异常标记为适用性异常:

<ejb-jar><assembly-descriptor><application-exception><exception-class>java.lang.NullPointerException</exception-class><rollback>true</rollback></application-exception></assembly-descriptor>
</ejb-jar>

第四部分:宁静的Web服务

企业应用程序通常需要通过Internet将其某些服务公开给外界。 这就是Web服务发挥作用的地方。 与JMS(用于异步通信)一样,Web服务是另一种经典的集成技术,用于使用XML(或JSON)作为交换格式实现面向请求响应的同步通信。

弹簧

<servlet><servlet-name>ws</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>ws</servlet-name><url-pattern>/services/*</url-pattern>
</servlet-mapping>
<!-- Dispatch requests to controllers + use JAXB (if found in the classpath) -->
<mvc:annotation-driven />
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import com.javacodegeeks.Geek;
import com.javacodegeeks.GeekService;@Controller
@RequestMapping("/geeks")
public class GeekWebService {@AutowiredGeekService bizService;@RequestMapping(value="/{id}", method=RequestMethod.GET)@ResponseBodypublic Geek getGeek(@PathVariable("id") long geekId) {return bizService.findGeek(geekId);}}
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name="geek")
public class Geek {private String name;private Long id;@XmlElementpublic String getName() {return name;}public void setName(String name) {this.name = name;}@XmlAttributepublic Long getId() {return id;}public void setId(Long id) {this.id = id;}}

JAVA EE 6

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;import com.javacodegeeks.Geek;
import com.javacodegeeks.GeekService;@Path("/geeks")
@Produces(MediaType.APPLICATION_XML)
public class GeekWebService {@InjectGeekService bizService;@GET@Path("/{id}")public Geek getGeek(@PathParam("id") long geekId) {return bizService.findGeek(geekId);}}
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name="geek")
public class Geek {private String name;private Long id;@XmlElementpublic String getName() {return name;}public void setName(String name) {this.name = name;}@XmlAttributepublic Long getId() {return id;}public void setId(Long id) {this.id = id;}}

备注:一些JAX-RS实现,例如JBoss RestEasy,不需要修改web.xml即可配置和安装Web服务…

第五部分:结论

认为与Java EE相比,Spring中的事情要简单得多,轻得多是不正确的。 这只是一个品味问题。 此外,最近的Java EE 6应用服务器(例如GlassFish 3或JBoss 6和7)的启动速度非常快,实际上几乎与Spring应用程序一样快。 然而,从“同类最佳”的角度来看,将两种技术结合起来可能仍然很有趣。 这将是我下一期JCG文章的主题:-)

参考: 从Spring到我们的W4G合作伙伴 Bernard Ligny的 Java EE 6

相关文章 :

  • 什么是CDI,它与@EJB和Spring有什么关系?
  • Spring Singleton,请求,会话Bean和线程安全
  • Devoxx 2011印象
  • Java EE6事件:JMS的轻量级替代品
  • Java EE6 CDI,命名组件和限定符
  • Java EE过去,现在和云7
  • Java SE 7、8、9 –推进Java

翻译自: https://www.javacodegeeks.com/2011/11/from-spring-to-java-ee-6.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos 6.5 搭建php环境(nginx+mariadb+php7)

1.mariaDb vim /etc/yum.repos.d/MariaDB.repo [mariadb] name MariaDB baseurl http://yum.mariadb.org/5.5/centos5-x86 gpgkeyhttps://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck1#如果服务器已经安装了MariaDB-Galera-server包&#xff0c;你可能需要在安装MariaDB-s…

MAC itunes无法验证服务器s.mzstatic/itunes无法更新服务器解决方案

打开host文件&#xff1a; 一、用终端打开&#xff1a; sudo vi /etc/hosts 输入完这行命令后需要输入电脑密码&#xff0c;然后确认&#xff0c;进入host文件 然后按i键进入编辑模式&#xff0c;在最后一行添加&#xff1a;23.214.233.166 s.mzstatic.com 如下图 添加完后&…

硬币问题——固定终点的最长路和最短路

问题描述&#xff1a; 有n种硬币&#xff0c;面值分别为V1,V2...,Vn,每种都有无限多。给定非负整数S&#xff0c;可以选用多少个硬币&#xff0c;使得面值之和恰好为S&#xff1f;输出硬币数目的最小值和最大值。0 < n < 100, 0 < S < 10000, 1 < Vi < S。 …

读取nas_NAS怎么玩?除了存放小姐姐,它竟然还有这些功能

自从有了电脑&#xff0c;就一直在折腾"存储那点事儿"&#xff0c;说到底&#xff0c;电脑的本质就是存储&#xff0c;而自己弄家用存储方面的东西算下来也有几年了。单机的硬盘存储比较简单&#xff0c;但是随着家里各种设备的增多&#xff0c;各个设备间的文件共享…

ZK Web框架思想

我曾多次被要求提出一些有关ZK的意见。 因此&#xff0c;根据我作为ZK用户4年的经验&#xff0c;以下是一些想法&#xff1a; 总体开发人员经验&#xff0c;社区和文档 “就是这样” ZK提供的大多数东西都能很好地工作&#xff0c;并且如果您以前开发过任何桌面Java应用程序&…

OC第一讲:类和对象

今天终于开始进行OC的学习了 一.首先讲了NSLog NSLog是oc里面的输出语句&#xff0c;其用法和printf差不多&#xff0c;但是还是有差别的 1&#xff0c;NSLog是自动换行的&#xff0c;不用像printf那样还需要加\n&#xff1b; 2&#xff0c;NSLog在引号面前需要添加符号&#x…

【转载】关于 Google Chrome 中的全屏模式和 APP 模式

【来源于】新浪微博&#xff1a;阿博 http://www.cnblogs.com/abel/p/3235839.html 全屏模式&#xff1a;kiosk 默认全屏打开一个网页呢&#xff0c;只需要在快捷方式中加上 --kiosk [url] 就可以了。 关于全屏模式&#xff1a; 1、全屏模式下&#xff0c;广告插件&#xff08;…

PL/SQL Developer跑在Oracle 64位数据库上初始化错误

安装完Oracle(64位)、PL/SQL Developer后运行PL/SQL出现如下的错误&#xff1a; 网上查资料说&#xff0c;我的PL/SQL Developer与ORACLE不兼容&#xff0c;即PL/SQL不支持64位的ORACLE&#xff0c;因此得下一个32位的ORCALE客户端并配置相应的参数&#xff1a; 解决步骤小记&a…

gis 联合 融合_GIS技术进化 | 我们为何需要跨平台GIS技术体系?

10月30日&#xff0c;超图在2019 GIS 软件技术大会上发布了SuperMap GIS 10i系列产品。SuperMap GIS 10i全面融入人工智能(AI)技术&#xff0c;创新并构建了GIS基础软件“BitCC”五大技术体系&#xff0c;即大数据GIS、人工智能GIS、新一代三维GIS、云原生GIS和跨平台GIS&#…

Spring陷阱:代理

作为Spring框架的用户和发烧友多年&#xff0c;我遇到了一些关于此堆栈的误解和问题。 另外&#xff0c;在某些地方抽象非常可怕地泄漏&#xff0c;以便有效&#xff0c;安全地利用开发人员需要意识到的所有功能。 这就是为什么我开始Spring陷阱系列的原因。 在第一部分中&…

UVa11925 Generating Premutations

留坑(p.254) 1 #include<cstdio>2 #include<cstring>3 #include<cstdlib>4 #include<algorithm>5 #include<iostream>6 7 using namespace std;8 9 void setIO(const string& s) { 10 freopen((s ".in").c_str(), "r&qu…

xamarin UWP中MessageDialog与ContentDialog的区别

MessageDialog与ContentDialog的异同点解析&#xff1a; 相同点一&#xff1a;都是uwp应用上的一个弹窗控件。都能做为弹出应用。 相异点一&#xff1a;所在命名空间不同&#xff0c;MessageDialog在Windows.UI.Popups.MessageDialog下&#xff0c;而ContentDialog在Windows.UI…

python筛选大量数据_python(数据筛选)

在Python3中&#xff1a;(1)xrange的功能合并到range里面&#xff0c;xrange已经不存在 -> range和xrange用法(2)filter已经不能返回一个list&#xff0c;而是只能返回一个迭代对象&#xff0c;需要套在一个list()里面&#xff0c;且&#xff0c;需要注意的是&#xff0c;fi…

ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务

不指定数据库可以正常连接&#xff1a; 指定数据库和使用PL/SQL Developer都出现错误&#xff1a; 在此说明一下我的环境&#xff1a;Oralce装的是64位的在使用PL/SQL Developer时曾出现过初始化错误&#xff0c;解决办法就是下载oracle 32位客户端并相应的配置。 解决方案一&a…

Devoxx 2011印象

Devoxx 2011结束了&#xff0c;它很棒。 最终&#xff0c;在不得不与妻子和孩子度过周末之后&#xff08;上个星期我很少见过&#xff09;&#xff0c;我找到了写下一些东西的时间。 对我来说&#xff0c;这是第六个Devoxx&#xff0c;我的第一个是2006年-那时我还是一个学生&a…

Ubuntu14.04.3,apt-get出现dpkg: error processing package xxx (--configure)和cups-daemon错误的解决方案...

Ubuntu14.04.3&#xff0c;使用apt-get安装软件的时候&#xff0c;报个莫名其妙的错误&#xff1a; dpkg: error processing package xxx (--configure): balabala...Errors were encountered while processing: cups-daemon cups-core-drivers cups E: Sub-process /usr/bin/d…

实验三 类的继承和多态性

实验三 类的继承和多态性 1.(1)编写一个接口ShapePara&#xff0c;要求&#xff1a; 接口中的方法&#xff1a; int getArea()&#xff1a;获得图形的面积。int getCircumference()&#xff1a;获得图形的周长 (2)编写一个圆类Circle&#xff0c;要求&#xff1a;圆类Circle实现…

ORA-01843:无效的月份

Oracle数据库默认情况下&#xff0c;会以DD-MON-YY的形式显示日期&#xff0c;其中DD是天数&#xff0c;MON是月份的前三个字母&#xff08;大写&#xff09;&#xff0c;而YY是年份的最后两位。数据库实际上会为年份存储4位数字&#xff0c;但是默认情况下只会显示最后两位。 …

贪心策略取得最优解的条件_什么是贪心算法?

一、什么是贪心算法贪心算法是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。(局部最优解&#xff0c;而不是整体最优解)贪心算法没有固定的算法框架&#xff0c;算法设计的关键是贪心策略的选择。必须注意的是&#xff0c;贪心算法不是对所有问题…

Devoxx第1天

参加Devoxx给我带来了足够的动力来发布我的第一篇博客文章。 我是第一次来这里&#xff0c;它的组织方式给我留下了深刻的印象。 目前有记录的最高发言人。 对我来说&#xff0c;选择演示文稿来参加是一个问题。 但是感谢组织者&#xff0c;所有活动都将在12月下旬在parleys.co…