從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.pswp.cn/news/373877.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373877.shtml
英文地址,請注明出處:http://en.pswp.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…